簡體   English   中英

pip freeze:僅顯示通過pip安裝的軟件包

[英]pip freeze: show only packages installed via pip

我想知道哪些python軟件包是通過pip安裝的,哪些是通過rpm安裝的。

任何virtualenv 外面運行,並想知道是否通過pip安裝了一些軟件包。

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

假設:

  • 我不確定紅帽,但對於debian / ubuntu。
  • 我假設你正在使用系統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$'

另請注意,通過此方法根本不會找到安裝到其他目​​錄中的任何軟件包: 使用pip將Python軟件包安裝到其他目​​錄中?

最后一招 ,使用pip show檢查pip中的確切安裝路徑。 實際上,只需從pip獲取名稱,將其輸入到pip show並過濾Name - > Location map的輸出。

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

怎么樣稍微轉動問題,只檢查什么屬於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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM