2012-10-22 10 views
5

Ho appena iniziato con Python e ho bisogno di un po 'di guida.Il modulo Python importa nel terminale ma non tramite la shell Unix

Sto usando un Mac, ma ho installato python.org di python e l'installazione originale di Apple.

Sto provando a caricare alcuni moduli di terze parti. Quando eseguo lo script in IDLE o tramite terminale, tutto funziona correttamente. Quando provo a eseguirlo come lavoro CRON, viene visualizzato un errore che indica che non è possibile trovare il modulo di terze parti.

Dopo alcuni tentativi, sono stato indotto a credere che si trattasse di PYTHONPATH/sys.path. Ho creato uno script di test per mostrarmi il mio percorso. Quindi, perché ottengo percorsi diversi quando viene eseguito attraverso la finestra del terminale rispetto direttamente come uno script di shell?

Le mie due domande sono:

  1. Perché sono diversi?
  2. Come posso ottenere il processo di shell diretta per trovare i moduli di terze parti?

Ecco la mia uscita sys.path quando l'eseguo nel terminale:

['/Library/Scripts', 
'/Library/Scripts/$', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.zip', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-darwin', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac/lib-scriptpackages', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-tk', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-old', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-dynload', 
'/Library/Python/2.7/site-packages'] 

Ecco la mia uscita sys.path quando l'eseguo nel guscio (in questo caso sono in Applescript con un "do shell script" step.

"['/Library/Scripts', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', 
'/Library/Python/2.7/site-packages']" 
+2

Si dovrebbe assolutamente guardare in virtualenv; ti aiuterà a destreggiarsi tra diverse versioni di python e variabili di percorso specifiche del progetto. –

risposta

4

Perché sono diversi?

Poiché si utilizzano due diversi interpreti Python e hanno valori di default diversi sys.path.

Questo è apposta: è ciò che consente di modificare la libreria standard (o di sito) dell'installazione di Python.org, senza interrompere l'installazione del sistema (o uno qualsiasi degli strumenti forniti da Apple che dipendono da tale installazione).

Sto indovinando che quando si esegue python in un terminale, che stai ricevendo /usr/local/bin/python (è possibile verificare che digitando which python), che è presumibilmente un collegamento a /Library/Frameworks/Python.framework/Versions/7.3/bin/python (o, eventualmente, a un Python.app/Contents/MacOS/python da qualche parte dentro questo quadro) . E che Python, da python.org, è stato compilato per impostare sys.path in /Library/Frameworks/Python.framework/Versions/7.3/.

Nel frattempo, quando si esegue python via Launch Services, probabilmente stai ricevendo /usr/bin/python, che è (si spera) il built-in spessore attorno /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python, che è compilato per impostare sys.path intorno /System/Library/Frameworks/Python.framework/Versions/2.7/.

La ragione python fa cose diverse in questi casi è che /usr/local/bin non è sul vostro login PATH a tutti, ma si aggiunge alla testa del percorso da una riga nel file ~/.profile (o altro). Quel file viene letto dalle sessioni di shell in Terminal, ma non dalle sessioni di Servizi di avvio.

Se si desidera utilizzare lo stesso Python in tutti gli ambienti, è possibile eseguire esplicitamente /usr/local/bin/python o /usr/bin/python anziché solo python.(Si potrebbe anche ottenere /usr/local/bin sul vostro PATH di accesso, ma questo è una pessima idea, o di ottenere dal tuo ~/.profile, ma questo è un po 'scomodo.)

Come nota a margine, questo è un segno che il vostro pitone. L'installazione org è molto frammentata:

/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.zip 

Non c'è Python 7.3. Prenderò in considerazione la possibilità di disinstallare e reinstallare la build di python.org.

Oppure, più semplicemente, disinstallarlo e lasciarlo disinstallato, e basta usare il built-in Python 2.7. Se si desidera più ambienti, utilizzare virtualenv anziché più installazioni. Se, ad es., Apple ti dà 2.7.2 e hai veramente bisogno di 2.7.3, allora hai bisogno di un'altra installazione; altrimenti, stai solo rendendo le cose più difficili senza alcun beneficio.

+0

BTW, credo che la versione di framework '7.3' di cui sopra sia da una distribuzione di OS X di Enthought Python, non da un'installazione non funzionante. Hanno usato il loro schema di versione del framework per coesistere con Python.org Python. –

Problemi correlati