我想知道哪些python软件包是通过pip安装的,哪些是通过rpm安装的。
我在外面运行任何virtualenv,并想知道是否通过pip安装了一些软件包。
背景:我们的政策是在“根级”使用RPM。我想找到政策被打破的地方。
答案 0 :(得分:2)
假设:
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'