如何点击包名网址列表

问题描述:

我想获取已安装的PIP包列表以及这些包的URL。如何点击包名网址列表

我知道有pip list命令列出了所有安装的软件包,但它没有显示软件包主页的URL。

还有pip show命令显示有关包的URL信息,但它只适用于一个包。

有没有一种方法可以将两个命令结合起来以获得包含各自主页URL的完整软件包列表?

+0

我只是做一个bash循环或使用'xargs'。 – wim

一种方式做到这一点是这个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

是的,这一行内容很好。谢谢! –

下面是一个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

现在就工作,谢谢! –