2017-10-19 69 views
2

我想獲取已安裝的PIP包列表以及這些包的URL。如何點擊包名網址列表

我知道有pip list命令列出了所有安裝的軟件包,但它沒有顯示軟件包主頁的URL。

還有pip show命令顯示有關包的URL信息,但它只適用於一個包。

有沒有一種方法可以將兩個命令結合起來以獲得包含各自主頁URL的完整軟件包列表?

+0

我只是做一個bash循環或使用'xargs'。 – wim

回答

2

一種方式做到這一點是這個shell一行代碼:

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

如果我們簡單地重新格式化pip show命令的輸出端通過xargspip list返回的所有包執行。

輸出示例:

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

下面是一個Python腳本,將顯示每個包的名稱與它的主頁URL一起。這有點令人費解,因爲pip沒有公共API,所以你必須使用它的主入口點並捕獲標準輸出。

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,在發射寫入(fs%msg) TypeError:unicode參數預計得到'str' 運行'packages = capture_pip_output(['list','--format','freeze')之後,從文件list.py中讀取第250行 ])'在Django shell –

+0

我針對Python 3.我會更新它,以便它也能在Python 2上運行。 – 2017-10-23 20:29:42

+0

現在就工作,謝謝! –