2012-06-08 10 views
7

Quando viene importato un modulo non incorporato, l'interprete cerca nelle posizioni indicate da sys.path. sys.path viene inizializzato da queste posizioni (http://docs.python.org/library/sys.html#sys.path):Come viene determinato il percorso di ricerca del modulo Python su Mac OS X?

  1. la directory che contiene lo script di input (o la directory corrente)
  2. PYTHONPATH
  3. l'installazione-dipendente predefinita

Mentre i primi due le fonti sono semplici, qualcuno può spiegare come funziona il terzo e quali possibilità ci sono per influenzarlo?

Anche se mi sarebbe interessato a una soluzione generale, i miei problemi specifici sono:

  • Ho installato il Enthought distribution 7.2 32-bit, e poi Scipy-Superpack. Ora enthought python prova ad importare numpy da /Library/Python/2.7/, che è il posto dove superpack li ha installati, invece che dai pacchetti del sito enthought.
  • a wxPython un'applicazione creata con py2app-A non ha lo stesso sys.path come all'avvio dell'applicazione con python start_app.py.

risposta

2

La base della terza sorgente viene impostata in fase di compilazione (o configurazione del tempo, più precisamente), a seconda della piattaforma. Viene quindi espanso e aggiunto a run-time tramite i file .pth, ecc. (Che è qualcosa che puoi fare una volta compilato il file eseguibile Python per influenzare quella terza fonte).

Questa pagina della documentazione Python ha tutte le informazioni su come funzionano le .pth file, e anche ulteriori informazioni su come sys.path è costruito dalle impostazioni di build-time, ecc http://docs.python.org/library/site.html

io non sono sicuro perché si vuole per influenzare specificamente quella terza fonte, quando è possibile influenzare l'intero sys.path. In ogni caso, i tre modi di influenzare sys.path (senza ricompilare Python o l'applicazione di patch il codice sorgente) sono:

  1. Via la variabile d'ambiente PYTHONPATH.
  2. Creando i file .pth e rilasciandoli dove Python esegue la scansione dei pacchetti. (Vedi il link in precedenza per i dettagli.)
  3. livello di programmazione, importando sys e poi aggiungendo o anteponendo al sys.path

    import sys 
    sys.path.insert(0, '/this/path/will/be/considered/first') 
    

Speriamo che uno di questi tre modi dovrebbe aiutare a fare quello che vuoi.

+0

Grazie per questa risposta! La ragione per cui sono interessato alla terza fonte in particolare è per i casi in cui ci sono librerie indesiderate che non sono in 'PYTHONPATH', che causano un errore in cui non ho accesso diretto a sys.path, ad es. quando si costruisce la documentazione della sfinge. – christianbrodbeck

1

Su un sistema Mac OS X 10.7.5, ho anche avuto il problema che Enthought python stava cercando moduli in /Library/Python/2.7/. Apparentemente, questo è stato causato dal file easy-install.pth che si trova in /Library/Python/2.7/site-packages. Dopo aver modificato l'estensione di questo file Enthought python ha importato i moduli Enthought (da /Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages).