2017-10-19 4 views
2

インストールされているPIPパッケージのリストを、それらのパッケージにURLで取得したいと考えています。パッケージURLをピップリストにする方法

pip listコマンドがインストールされているすべてのパッケージを一覧表示していますが、パッケージホームページのURLは表示されません。

また、pip showコマンドもあります。このコマンドは、URLを含むパッケージに関する情報を表示しますが、1つのパッケージに対してのみ機能します。

両方のコマンドを組み合わせて、それぞれのホームページURLを持つパッケージの完全なリストを取得する方法はありますか?それを行うには

+0

私はちょうどループ用のbashや 'xargs'を使用します。 – wim

答えて

2

一つの方法は、このシェルワンライナーである:我々は単にpip showコマンドの出力を再フォーマット

pip list --format=freeze | cut -d= -f1 | xargs pip show | awk '/^Name/{printf $2} /^Home-page/{print ": "$2}' 

pip listによって返されたすべてのパッケージのxargsを介して実行されています。

出力例:

appdirs: http://github.com/ActiveState/appdirs 
packaging: https://github.com/pypa/packaging 
pip: https://pip.pypa.io/ 
setuptools: https://github.com/pypa/setuptools 
six: http://pypi.python.org/pypi/six/ 
wheel: https://bitbucket.org/pypa/wheel/ 
+1

ええ、このワンライナーはうまくいきます。ありがとう! –

2

は、ここでそのホームページのURLと一緒に各パッケージ名が表示されますPythonスクリプトです。 pipには公開APIがないので、ちょっと複雑です。メインエントリポイントを使用してstdoutを取得する必要があります。

import pip 
import sys 

if sys.version_info[0] == 2: 
    import StringIO 
    IO = StringIO.StringIO 
else: 
    import io 
    IO = io.StringIO 

def capture_pip_output(args): 
    stdout = IO() 
    sys.stdout = stdout 
    pip.main(args) 
    sys.stdout = sys.__stdout__ 
    return stdout.getvalue().splitlines() 

packages = capture_pip_output(['list', '--format', 'freeze']) 
packages = [line.split('==', 1) for line in packages] 

for package, version in packages: 
    info = capture_pip_output(['show', package]) 
    for line in info: 
     if line.startswith('Home-page: '): 
      url = line.split(': ', 1)[1] 
      break 
    print('{package} {url}'.format(package=package, url=url)) 
+1

ありがとう!しかし、これは私にとっては役に立たなかった。私は次のようになっています: トレースバック(最新の最後の呼び出し): ファイル "/home/mike/.pyenv/versions/2.7.3/lib/python2.7/logging/__init__.py"、行867、emit 'pack = capture_pip_output(['list'、 '--format'、 'freeze')を実行した後、ファイルlist.py、line 250 からログに記録されます。 ]) 'Djangoシェルで –

+0

私はPython 3を対象としました。Python 2でも動作するように更新します。 –

+0

今、ありがとう! –

関連する問題