web-dev-qa-db-ja.com

python pipでインストールされたパッケージの依存関係の特定

Pip freezeを行うと、多数のPython私が明示的にインストールしなかったパッケージ、たとえば.

$ pip freeze
Cheetah==2.4.3
GnuPGInterface==0.3.2
Landscape-Client==11.01
M2Crypto==0.20.1
PAM==0.4.2
PIL==1.1.7
PyYAML==3.09
Twisted-Core==10.2.0
Twisted-Web==10.2.0
(etc.)

Pipがこれらの特定の依存パッケージをインストールした理由を判断する方法はありますか?言い換えると、これらのパッケージを依存関係として持っている親パッケージをどのように判断するのですか?

たとえば、Twistedを使用したい場合があります。誤ってパッケージをアンインストールしたりアップグレードしたりしないようにするまで、パッケージに依存したくありません。

119
Mark Chackerian

pipdeptree を試すことができます。これは、依存関係をツリー構造として表示します。例:

$ pipdeptree
Lookupy==0.1
wsgiref==0.1.2
argparse==1.2.1
psycopg2==2.5.2
Flask-Script==0.6.6
  - Flask [installed: 0.10.1]
    - Werkzeug [required: >=0.7, installed: 0.9.4]
    - Jinja2 [required: >=2.4, installed: 2.7.2]
      - MarkupSafe [installed: 0.18]
    - itsdangerous [required: >=0.21, installed: 0.23]
alembic==0.6.2
  - SQLAlchemy [required: >=0.7.3, installed: 0.9.1]
  - Mako [installed: 0.9.1]
    - MarkupSafe [required: >=0.9.2, installed: 0.18]
ipython==2.0.0
slugify==0.0.1
redis==2.9.1

実行するには:

pip install pipdeptree


EDIT:@Estebanのコメントにあるように、-rまたは-p <package_name>を含む単一のパッケージなので、Werkzeugをインストールしたものを見つけるには、次のコマンドを実行できます。

$ pipdeptree -r -p Werkzeug
Werkzeug==0.11.15
  - Flask==0.12 [requires: Werkzeug>=0.7]
134
djsutho

pip showコマンドは、指定されたパッケージに必要なパッケージを表示します(指定されたパッケージは既にインストールされている必要があります)。

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

pip showはpipバージョン1.4rc5で導入されました

66
BernardoFire

hn thread で最近言ったように、次のことをお勧めします。

主な依存関係を含むコメント付きrequirements.txtファイルを用意します。

## this is needed for whatever reason
package1

依存関係をインストールします:pip install -r requirements.txtpip freeze -r requirements.txtを使用して、依存関係の完全なリストを取得します。

## this is needed for whatever reason
package1==1.2.3

## The following requirements were added by pip --freeze:
package1-dependency1==1.2.3
package1-dependency1==1.2.3

これにより、ファイル構造をコメントで保持し、依存関係を依存関係の依存関係からうまく分離できます。このようにして、それらのいずれかを削除する必要がある日がずっと楽しくなります:)

次のことに注意してください。

  • 完全なrequirements.rawを再構築するために、バージョン管理付きのクリーンなrequirements.txtを使用できます。
  • 処理中にgit URLがEgg名に置き換えられることに注意してください。
  • 依存関係の依存関係はまだアルファベット順にソートされているため、どのパッケージにどの依存関係が必要かは直接わかりませんが、この時点では実際には必要ありません。
  • 特定の要件をリストするには、pip install --no-install <package_name>を使用します。
  • 使用しない場合は、 virtualenv を使用します。
12
Maxime R.

要件のパッケージをpip showにパイプする1行のコマンドを使用することもできます。

cut -d'=' -f1 requirements.txt | xargs pip show
6
biophetik

まず第一に pip freezeは、現在インストールされているすべてのパッケージPythonを表示します。必ずしもPIPを使用しているわけではありません。

次に、Pythonパッケージには、依存パッケージに関する情報と 必須バージョン が含まれています。特定のpkgの依存関係は、メソッドを使用して確認できます ここで説明 。パッケージをアップグレードする場合、PIPなどのインストーラースクリプトが依存関係のアップグレードを処理します。

パッケージの更新を解決するには、 PIP要件ファイル を使用することをお勧めします。必要なパッケージとバージョンを定義し、pip installを使用してそれらを一度にインストールできます。

3
Mariusz Jamro

この問題を解決する簡単なスクリプトを書きました。次のスクリプトは、特定のパッケージの親(依存)パッケージを表示します。これにより、特定のパッケージをアップグレードまたはインストールしても安全であることを確認できます。次のように使用できます:dependants.py PACKAGENAME

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""Find dependants of a Python package"""

import logging
import pip
import pkg_resources
import sys

__program__ = 'dependants.py'


def get_dependants(target_name):
    for package in pip._internal.utils.misc.get_installed_distributions():
        for requirement_package in package.requires():
            requirement_name = requirement_package.project_name
            if requirement_name == target_name:
                yield package.project_name


# configure logging
logging.basicConfig(format='%(levelname)s: %(message)s',
                    level=logging.INFO)

try:
    target_name = sys.argv[1]
except IndexError:
    logging.error('missing package name')
    sys.exit(1)

try:
    pkg_resources.get_distribution(target_name)
except pkg_resources.DistributionNotFound:
    logging.error("'%s' is not a valid package", target_name)
    sys.exit(1)

print(list(get_dependants(target_name)))
1
Six

(回避策、真の答えではない)

同じ問題がありました。lxmlがインストールされておらず、lxmlが必要な人を知りたいのです。 誰がlxmlを必要としていないか。で問題をバイパスしてしまいました。

  1. 私のサイトパッケージがどこに置かれているかに注意してください。

  2. そこに行き、インポート用の再帰grepを実行します(最後のgrepの--invert-matchは、lxml自身のファイルを考慮から削除します)。

はい、それを行うためにpipを使用する方法についての答えではありませんが、何らかの理由で、ここでの提案からは成功しませんでした。

 site-packages me$ egrep -i --include=*.py  -r -n lxml . | grep import | grep --invert-match /lxml/
0
JL Peyret