Pythonパッケージの依存関係を見つける方法


103

プログラムでPythonパッケージの依存関係のリストを取得するにはどうすればよいですか?

標準にsetup.pyはこれらが文書化されていますが、Pythonまたはコマンドラインから標準にアクセスする簡単な方法が見つかりません。

理想的には、私は次のようなものを探しています:

$ pip install somepackage --only-list-deps
kombu>=3.0.8
billiard>=3.3.0.13
boto>=2.26

または:

>>> import package_deps
>>> package = package_deps.find('somepackage')
>>> print package.dependencies
['kombu>=3.0.8', 'billiard>=3.3.0.13', 'boto>=2.26']

注、私はパッケージのインポートとすべての参照モジュールの検索について話しているのではありません。これはほとんどの依存パッケージを見つける可能性がありますが、必要な最小バージョン番号を見つけることができません。これはsetup.pyにのみ保存されます。


ここでかなりの数の回答が、プログラムで使用するためにインポートされているpipを示しています。pipドキュメントでは、このpipの使用を強くお勧めしていません。これらのソリューションのいずれかが重要な何かに使用されている場合に留意する必要があるもの。
ジョーダンマッキー

回答:


97

pip show [package name]コマンドの他に、がありpipdeptreeます。

するだけ

$ pip install pipdeptree

次に実行します

$ pipdeptree

そして、それはあなたの依存関係をツリー形式で表示します、例えば、

flake8==2.5.0
  - mccabe [required: >=0.2.1,<0.4, installed: 0.3.1]
  - pep8 [required: !=1.6.0,>=1.5.7,!=1.6.1,!=1.6.2, installed: 1.5.7]
  - pyflakes [required: >=0.8.1,<1.1, installed: 1.0.0]
ipdb==0.8
  - ipython [required: >=0.10, installed: 1.1.0]

プロジェクトはhttps://github.com/naiquevin/pipdeptreeにあり、ここには使用方法の情報もあります。


7
pipdeptree特定のパッケージの依存関係だけでなく、インストールされているすべての パッケージの依存関係を表示します。その出力をフィルタリングすることもできますが、それはまだインストール済みのパッケージに依存しています。--json
sschuberth 2017

requirements.txt
確かに、しかし

3
さらに、この-pオプションを使用して、依存関係を調査する少数のパッケージのみを選択できます。
Zaccharie Ramzi

2
pipdeptree最適化するときに非常に役に立ちましたrequirements.txt$ pipdeptree | grep -P '^\w+' これはトップレベルのパッケージのみを出力します。詳細はこちら
リード開発者

63

たとえばでshowコマンドを使用してみてくださいpip

$ pip show tornado
---
Name: tornado
Version: 4.1
Location: *****
Requires: certifi, backports.ssl-match-hostname

更新(指定したバージョンのdepを取得):

from pip._vendor import pkg_resources


_package_name = 'somepackage'
_package = pkg_resources.working_set.by_key[_package_name]

print([str(r) for r in _package.requires()])  # retrieve deps from setup.py

Output: ['kombu>=3.0.8', 
         'billiard>=3.3.0.13', 
         'boto>=2.26']

1
これにより、依存関係ではなく、パッケージのバージョンがわかります。彼らはちょうどリストされます。
jonrsharpe 2015

Requiresセクションを参照
Alex Lisovoy 2015

3
はい、それは表示されません「最小限のバージョン番号が必要」 OPが必要とする、:
jonrsharpe

1
何とか$ pip3 show beautifulsoup4ショーが空にRequires: 私のために-何に依存しませんbeautifulsoup4?
xealits 2016

4
@PythonJin、うん、どうやらそれは標準パッケージのみを使用している。私はそれで少し驚いた。よくできましたbeautifulsoup4
xealits '19年

6

ここでかなりの数の回答が、プログラムで使用するためにインポートされているpipを示しています。pipドキュメントでは、このpipの使用を強くお勧めしていません

pkg_resourcespipインポートを介してアクセスする代わりに、実際にpkg_resources直接インポートして同じロジックを使用することができます(これは、パッケージメタ情報をプログラムで確認したい人のためにリンクされたpipドキュメントで実際に提案されているソリューションの1つです)。

import pkg_resources

_package_name = 'yourpackagename'

def get_dependencies_with_semver_string():
    package = pkg_resources.working_set.by_key[_package_name]
    return [str(r) for r in package.requires()]

パッケージ名が正確にわからないWorkingSet場合は、pkg_resources.working_setimplements によって返されるインスタンス__iter__からを使用して、すべての、そこに自分のことができます。

すなわち

import pkg_resources

def print_all_in_working_set():
    ws = pkg_resources.working_set
    for package_name in ws:
        print(ws)

これはpython 2と3の両方で動作します(ただし、python2の印刷ステートメントを調整する必要があります)


3

(これは旧式の回答であり、最新のPIPバージョンについては回避し、古いPIPバージョンを参照するためにここに残しておく必要があります)アレックスの回答は適切です(+1)。Pythonでは:

pip._vendor.pkg_resources.working_set.by_key['twisted'].requires()

のようなものを返す必要があります

[Requirement.parse('zope.interface>=3.6.0')]

ここで、twistedはパッケージの名前であり、辞書で見つけることができます。

pip._vendor.pkg_resources.WorkingSet().entry_keys

それらをすべてリストするには:

dict = pip._vendor.pkg_resources.WorkingSet().entry_keys
for key in dict:
    for name in dict[key]:
        req =pip._vendor.pkg_resources.working_set.by_key[name].requires()
        print('pkg {} from {} requires {}'.format(name,
                                                  key,
                                                  req))

次のようなリストが表示されます。

pkg pyobjc-framework-syncservices from /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC requires [Requirement.parse('pyobjc-core>=2.5.1'), Requirement.parse('pyobjc-framework-Cocoa>=2.5.1'), Requirement.parse('pyobjc-framework-CoreData>=2.5.1')]

最近のバージョンで何か変更はありますか?この_vendor属性はpipバージョンには存在しないようです19.1.1(編集:pkg_resources
はい

はい、状況は変わりました。以下の推奨事項に従って、これを更新するか削除するかを検討します。
cgseller

アレックスの答えは、私の観点からは部分的にしかpip show良くありません(まあ、一部は良好で、残りは良好です)。使用するかpip showpipdeptreeまたは使用してヨルダンMackieの答えを参照してくださいsetuptoolsのを " pkg_resources直接。
sinoroc

2

https://libraries.io/を使用します。pipを使用してインストールする前に、依存関係を調査するのに適しています。

例えば。google-cloud-storageと入力して検索すると、ライブラリのページ(https://libraries.io/rubygems/google-cloud-storage)が見つかります。「リリース」(デフォルトは最新)から依存関係を調査するバージョンを選択します。「依存関係」で、依存関係リストとサポートされているバージョンを確認できます。


1

このPythonの記事に従ってこれを試してください:

import pip 
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
     for i in installed_packages]) 
print(installed_packages_list)

次のように表示されます。

['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24', 
 'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3', 
 'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
 'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1', 
 'werkzeug==0.9.4']
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.