2013-03-29 31 views
21

Pythonパッケージの依存関係ツリーを分析したいと思います。どのようにしてこのデータを入手できますか?私はすでに知っているPythonパッケージの依存関係ツリー

物事が

  1. setup.pyは時々、パッケージの依存関係
  2. を示していますrequiresフィールドが含まれては、PyPIはPythonパッケージのオンラインリポジトリ
  3. は、PyPIは

物事APIを持っていますわからない

  1. requiresフィールドでPyPiのプロジェクト(約10%)が明示的に依存関係をリストすることはほとんどありませんが、pip/easy_installは依然として正しいパッケージをダウンロードできます。私は何が欠けていますか?たとえば、統計計算の普及しているライブラリpandasは、requiresをリストしていませんが、まだnumpypytzなどをインストールしています。自動的に依存関係の完全なリストを自動的に収集する良い方法はありますか?
  2. どこかに既存のデータベースがありますか?私は既存の仕事を繰り返すのですか?
  3. は簡単にアクセスできる、類似した、データベースはあなたが代わりに、 New and changed setup keywordsを参照してください install_requiresフィールド されているはずです
+0

あなたの質問は、実際には広すぎます。投稿にはあまりにも多くの質問を入れてはいけません。実用的であり、答えることができます。あなたのポイント3.具体的な回答ではなく、議論や買い物リストを呼び寄せます。 –

答えて

18

流通システム(R、Clojureの、等...?)と他の言語のために存在しています。

requiresは、依存性インストールに依存するフィールドがあまりにも漠然としているとみなされます。さらに、setup.pyに必要な依存関係のフィールドとテストの実行には、setup_requirestest_requiresのフィールドがあります。

確かに、従属グラフは前に分析されています。このblog article by Olivier Girardotからこの素晴らしいイメージが来る:

PyPI dependencies
画像はグラフのインタラクティブバージョンにリンクされています。

+1

賛辞のための:p –

+4

まあ、それはとても美しいグラフです! –

+1

そのグラフは信じられないほどです。 – Will

2

pipのようなツールを使用すると、各パッケージのすべての要件をリストできます。

コマンドは次のとおりです。

pip install --no-install package_name 

あなたのスクリプトでピップの一部を再利用することができます。要件を解析する部分は、モジュールpip.reqです。ここで

+2

私はPythonの中から 'pip'を使う考えが好きです。すでにパッケージがインストールされている場合、コマンドラインインターフェイスは失敗します。 Pythonコードを直接使用して特定のパッケージの依存関係を見つけるにはどうすればよいですか? – MRocklin

+1

'--no-install'は推奨されていません。 –

0

はあなたのpython pipパッケージを使用してプログラムでそれを行うことができる方法である。

from pip._vendor import pkg_resources # Ensure pip conf index-url pointed to real PyPi Index 

# Get dependencies from pip 
package_name = 'Django' 
try: 
    package_resources = pkg_resources.working_set.by_key[package_name.lower()] # Throws KeyError if not found 
    dependencies = package_resources._dep_map.keys() + ([str(r) for r in package_resources.requires()]) 
    dependencies = list(set(dependencies)) 
except KeyError: 
    dependencies = [] 

そして、ここでは、は、PyPIのAPIからの依存関係を得ることができる方法である。

import requests 
import json 
package_name = 'Django' 
# Package info url 
PYPI_API_URL = 'https://pypi.python.org/pypi/{package_name}/json' 
package_details_url = PYPI_API_URL.format(package_name=package_name) 
response = requests.get(package_details_url) 
data = json.loads(response.content) 
if response.status_code == 200: 
    dependencies = data['info'].get('requires_dist') 
    dependencies2 = data['info'].get('requires') 
    dependencies3 = data['info'].get('setup_requires') 
    dependencies4 = data['info'].get('test_requires') 
    dependencies5 = data['info'].get('install_requires') 
    if dependencies2: 
     dependencies.extend(dependencies2) 
    if dependencies3: 
     dependencies.extend(dependencies3) 
    if dependencies4: 
     dependencies.extend(dependencies4) 
    if dependencies5: 
     dependencies.extend(dependencies5) 
    dependencies = list(set(dependencies)) 

あなたが呼び出すために再帰を使用することができます完全なツリーを得るために依存関係の依存関係。乾杯!

関連する問題