2016-05-26 24 views
5

Voglio sapere quali pacchetti python sono installati tramite pip e che vengono installati tramite rpm.freeze: mostra solo i pacchetti installati tramite pip

Corro all'esterno di qualsiasi virtualenv e voglio sapere se ci sono alcuni pacchetti installati tramite pip.

Background: la nostra politica prevede l'utilizzo di RPM a "livello root". Voglio trovare posti in cui la politica è stata infranta.

+0

La vostra situazione è, si dispone di più virtualenvs, e si desidera controllare i pacchetti installati tramite pip dal livello di root? – Laszlowaty

+0

Se 'pip list' restituisce un elenco di tutti i pacchetti installati, è possibile usare' rpm -qa' per trovare i pacchetti installati tramite 'rpm' e la differenza tra i due sarà i pacchetti non conformi alla propria politica. Il lavoro sopra funzionerebbe per te? –

+0

Suppongo che entrambi i nomi non siano sempre identici (byte per byte), ma solo simili (uguali alla ricerca del cervello umano). Un esempio: pip freeze dice "python-dateutil", il nome RPM è lo stesso. pip freeze mi dice "Pillow", come RPM si chiama python-Pillow ... – guettli

risposta

2

Che ne dici di girare la domanda leggermente, e basta controllare ciò che appartiene a rpms e cosa no. Prova:

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

E pipe l'output attraverso qualcosa di simile

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

Sì, fantastico. In questo modo ho potuto trovare il materiale che è stato installato tramite pip come root. Mi piace pip, ma solo in virtualenv :-) – guettli

1

Ipotesi:

  • non sono sicuro sul rosso-cappello, ma per Debian/Ubuntu.
  • Suppongo che si stia utilizzando Python di sistema.
  • Non penso che importi, ma potrebbe essere necessario controllare pip install --user <package_name> per installazioni di pacchetti utente locali.

Per impostazione predefinita sul sistema debian pacchetti installati sono installati in:

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

e PIP pacchetti installati sono installati in:

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

Per vedere tutti i percorsi di installazione si può essere eseguito all'interno della tua shell python:

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

Come da pip freeze docs-l mostrerà qualsiasi installazione locale di pacchetti (ad es. non pacchetti globali) Tuttavia, è necessario essere nell'ambiente corretto.

pip freeze -l 

Se Virtualenvs entrano in gioco: Useranno site-packages directory.

locate -r '/site-packages$' 

noti inoltre tutti i pacchetti installati in una directory diversa, non sarà situato a tutti tramite questo metodo: Install a Python package into a different directory using pip?

trucco finale, controllare il percorso esatto di installazione in pip usando spettacolo pip. Effettivamente, prendi solo i nomi da pip, condividi quello in un pip show e filtra l'output per Nome -> Mappa posizione.

+1

'pip freeze -l' è nuovo per me. Ho visto il diff tra freeze con e senza '-l' (all'interno di un virtualenv). Funziona bene per rilevare "dentro o fuori" virtualenv. Ma non aiuta a decidere "da-rpm o da pip". – guettli

+0

Il rpm si installa in una posizione diversa rispetto a pip sulla configurazione? per esempio '/ usr/lib /' vs '/ usr/bin/local /' o è lo stesso? –

+1

no sfortunatamente no. Si installa nella stessa posizione: '/ usr/lib/python2.7/site-packages /' – guettli

Problemi correlati