pip freeze:仅显示通过pip安装的软件包

时间:2016-05-26 13:08:05

标签: python pip

我想知道哪些python软件包是通过pip安装的,哪些是通过rpm安装的。

我在外面运行任何virtualenv,并想知道是否通过pip安装了一些软件包。

背景:我们的政策是在“根级”使用RPM。我想找到政策被打破的地方。

2 个答案:

答案 0 :(得分:2)

假设:

  • 我不确定红帽,但是对于debian / ubuntu。
  • 我假设您正在使用system python。
  • 我认为这不重要,但您可能需要检查pip install --user <package_name>本地用户包安装。

默认情况下,debian系统安装的软件包安装在:

/usr/lib/python2.7/dist-packages/

pip安装包安装在:

/usr/bin/local/python2.7/dist-packages

要查看可以在python shell中运行的所有安装路径:

import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

根据pip freeze docs -l将显示任何本地安装包(即非全局包)但是,您需要处于正确的环境中。

pip freeze -l

如果Virtualenvs发挥作用:他们将使用site-packages个目录。

locate -r '/site-packages$'

另请注意,通过此方法根本无法找到安装到其他目​​录中的所有软件包:Install a Python package into a different directory using pip?

最后一招, 使用pip show检查pip中的确切安装路径。实际上,只需从pip获取名称,将其输入到pip show并过滤Name的输出 - &gt;位置图。

pip freeze | awk '{split($0,a,"="); print a[1]}' | xargs -P 5 -I {} pip show {} | grep 'Name\|Location'

答案 1 :(得分:2)

如何轻微转动问题,并检查什么属于rpms,什么不属于。尝试:

import os, sys, subprocess, glob

def type_printed(pth, rpm_dirs=False):

    if not os.path.exists(pth):
        print(pth + ' -- does not exist')
        return True        
    FNULL = open(os.devnull, 'w')
    if rpm_dirs or not os.path.isdir(pth):
        rc = subprocess.call(['rpm', '-qf', pth], stdout=FNULL, stderr=subprocess.STDOUT) 
        if rc == 0:
            print(pth + ' -- IS RPM')
            return True 
        print(pth + ' -- NOT an RPM')
        return True 
    return False 


for pth in sys.path:
    if type_printed(pth):
        continue 
    contents = glob.glob(pth + '/*') 
    for subpth in contents:
        if type_printed(subpth, rpm_dirs=True):
            continue
        print(subpth + ' -- nothing could be determined for sure')

通过

之类的方式输出输出
grep -e '-- NOT' -e '-- nothing could be determined'