2013-07-03 34 views
5

Per installare pacchetti Python di terze parti, ho utilizzato uno script setup.py che utilizza setuptools.setup() per installare un sacco di pacchetti. Dopo l'installazione posso trovare questi pacchetti su una macchina sotto /usr/local/lib/python2.7/dist-packages e su un'altra macchina sotto /usr/lib/python2.7/site-packages.Come trovare il percorso di installazione della libreria Python?

Ora voglio scrivere uno script Python che scopre dove sono stati installati i pacchetti di terze parti. Come lo posso fare?

1) sys.prefix = sys.exec_prefix è su entrambe le macchine "/ usr".

2) L'eseguibile python si trova su entrambe le macchine/usr/bin/python.

3) distutils.sysconfig.get_python_lib() è /usr/lib/python2.7/dist-packages ("local" è mancante) su una macchina e /usr/lib/python2.7/site-packages su l'altra macchina.

risposta

0

Non conosco un buon modo per farlo in Python (oltre a scansionare le directory da una determinata directory per cercare un file usando os.walk). Se non si ottengono risposte migliori su come farlo in Python, è possibile eseguire un comando sul proprio sistema operativo da python per eseguire un comando di ricerca standard Linux/Unix sulla libreria che si sta cercando. Potresti usare lo subprocess module per farlo.

+0

Preferirei una soluzione più "elegante" rispetto alla ricerca sugli alberi delle directory. In che modo setuptools sa dove installare? – user2539266

+0

Il punto è che anche se fosse possibile utilizzare lo stesso metodo per stabilire la directory predefinita, ciò non consentirebbe scenari in cui l'utente non ha utilizzato l'impostazione predefinita. Non so in nessun altro modo, ma sarò interessato a vedere quali altri suggerimenti emergono. – ChrisProsser

4

Se sono già stati installati i pacchetti, si può solo importarli, e guardare in loro proprietà __file__:

>>> import mymodule 
>>> print mymodule.__file__ 
'/path/to/mymodule.py' 
+0

Interessante trucco. Ma non può essere usato, se i pacchetti installati sono diversi sui diversi host e non si sa se un determinato modulo è installato su un determinato host. – user2539266

+0

Questo è stato utile per ottenere la mia risposta. –

1

Quasi trovato una soluzione a questo problema. Ho votato a this question e this question quindi grazie alle risposte fornite lì.

In primo luogo è necessario ottenere un elenco di tutti i moduli installati in un elenco. Utilizzare this question per acquisire l'output di solution to this question.

Ora hai una lista di tutti i moduli python installati. Dovrai vedere il formato dell'elenco e quindi formattarlo correttamente per ottenere singoli elementi come i nomi dei moduli.

Quindi è possibile importare i moduli dai loro nomi come stringhe come spiegato here. Quindi, come già detto alejandro, mymodule.__file__ contiene i percorsi.

Questa è una soluzione che dovrebbe funzionare. Non molto elegante ma sono solo un principiante di Python che è meglio su google search di Python


Ho trovato un modo molto più semplice per trovare dove sono i moduli. Questa potrebbe essere la soluzione "elegante" che OP stava cercando.

import sys 
print sys.path 

Dalla documentazione Python su sys modulesys.path contiene

una lista di stringhe che specifica il percorso di ricerca per i moduli. Inizializzato dalla variabile di ambiente PYTHONPATH, oltre a un valore predefinito di installazione.

+0

Non so come avanzare quali sono le possibili directory da guardare. Può essere/usr o/usr/local o un'installazione privata di Python, può essere dist-packages o site-packages. In che modo setuptools sa dove installare? – user2539266

+0

@ user2539266 Aggiornamento della risposta. Dare un'occhiata. –

0

Ho trovato il mio percorso di installazione tramite sys.path:

my_name = "mypackage" 
def _post_install(): 
    def find_module_path(): 
     for p in sys.path: 
      if os.path.isdir(p): 
       for f in os.listdir(p): 
        if f == my_name: 
         return os.path.join(p, f) 
    install_path = find_module_path() 
    # do something we the install_path 

Nota: Questo funziona dopo che il pacchetto è stato registrato dal setuptools, e probabilmente hanno anche per gestire se il pacchetto è stato installato in più directory all'interno dello sys.path.

Problemi correlati