我想获得已安装的PIP包列表以及这些包的URL。
我知道有pip list
命令列出了所有已安装的软件包,但它没有显示软件包主页的URL。
还有pip show
命令显示包含其URL的包的信息,但它仅适用于一个包。
有没有办法将两个命令组合在一起,以获得包含各自主页URL的完整包列表?
答案 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))