如何使用包网址

时间:2017-10-19 19:47:06

标签: python pip

我想获得已安装的PIP包列表以及这些包的URL。

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

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

有没有办法将两个命令组合在一起,以获得包含各自主页URL的完整包列表?

2 个答案:

答案 0 :(得分:5)

一种方法是使用这个shell单行:

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

我们只是为pip show返回的所有包重新格式化了通过xargs执行的pip 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))