2016-05-26 2 views
5

Ich möchte wissen, welche Python-Pakete über Pip installiert sind und welche über RPM installiert sind.pip freeze: Zeige nur Pakete installiert über pip

Ich renne außerhalb irgendein virtualenv, und möchte wissen, ob es einige Pakete über Pip installiert sind.

Hintergrund: Unsere Richtlinie besteht darin, RPM auf "root level" zu verwenden. Ich möchte Orte finden, wo die Politik gebrochen wurde.

+0

Ihre Situation ist, mehrere virtualenvs haben, und Sie wollen Pakete über pip von der Root-Ebene installiert überprüfen? – Laszlowaty

+0

Wenn 'pip list' eine Liste aller installierten Pakete zurückgibt, können Sie 'rpm -qa' verwenden, um die Pakete zu finden, die über' rpm' installiert wurden. Der Unterschied zwischen den beiden Paketen sind Pakete, die nicht Ihrer Richtlinie entsprechen. Würde das oben genannte für Sie funktionieren? –

+0

Ich denke, beide Namen sind nicht immer identisch (Byte pro Byte), aber nur ähnlich (gleiche Suche nach dem menschlichen Gehirn). Ein Beispiel: Pip Freeze sagt es "Python-Dateutil", RPM-Name ist der gleiche. Pip Freeze sagt mir "Pillow", wie RPM heißt Python-Pillow ... – guettli

Antwort

2

Wie wäre es mit der Frage ein wenig umdrehen, und nur überprüfen, was zu RPMs gehört und was nicht. Versuchen:

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') 

Und Rohr die Ausgabe durch so etwas wie

grep -e '-- NOT' -e '-- nothing could be determined' 
+0

Ja, großartig. Auf diese Weise konnte ich die Sachen finden, die via pip als root installiert wurden. Ich mag Pip, aber nur in virtualenv :-) – guettli

1

Annahmen:

  • Ich bin über rot-Hut nicht sicher, aber für Debian/Ubuntu.
  • Ich nehme an, Sie verwenden System Python.
  • Ich glaube nicht, dass es wichtig ist, aber Sie müssen möglicherweise überprüfen, pip install --user <package_name> für lokale Benutzer-Paket installiert.

standardmäßig auf Debian-System installierten Pakete werden bei installiert:

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

Und sind pip installierten Pakete installiert unter:

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

Um alle Installationspfade Sie kann innerhalb Ihrer Python-Shell laufen:

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

Wie die pip freeze docs-l zeigt Ihnen alle lokalen Installationen von Paketen (d. H. nicht globale Pakete) Sie müssen jedoch in der richtigen Umgebung sein.

pip freeze -l 

Wenn Virtualenvs ins Spiel kommen: werden Sie site-packages Verzeichnisse verwenden.

locate -r '/site-packages$' 

beachten Sie auch alle in ein anderes Verzeichnis installiert Pakete werden überhaupt nicht mit dieser Methode befindet: Install a Python package into a different directory using pip?

Schluss Trick, den genauen Installationspfad in pip prüft pip Show mit. Nutze nun einfach die Namen von Pip, pipe diese in eine Pipshow und filtere die Ausgabe für den Name -> Location map.

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

'pip freeze -l' ist neu für mich. Ich schaute auf den Unterschied zwischen einfrieren mit und ohne '-l' (innerhalb eines virtualenv). Funktioniert gut, um "innen oder außen" virtualenv zu erkennen. Aber es hilft nicht, "von-rpm oder von pip" zu entscheiden. – guettli

+0

Installiert rpm an einem anderen Ort als Pip auf Ihrem Setup? zum Beispiel '/ usr/lib /' vs '/ usr/bin/local /' oder ist es das gleiche? –

+1

nein leider nicht. Es wird an der gleichen Stelle installiert: '/ usr/lib/python2.7/site-packages /' – guettli