2013-02-27 11 views
33

Il mio codice è:set PYTHONPATH prima di istruzioni import

import scriptlib.abc 
import scriptlib.xyz 

def foo(): 
    ... some operations 

ma lo ScriptLib è in qualche altra directory, quindi mi dovrà includere tale directory in ambiente "PYTHONPATH" variabile.

C'e 'qualche cosa in cui posso aggiungere prima la directory ScriptLib in un ambiente "PYTHONPATH" variabile prima istruzione import della sedia elettrica come:

import sys 
sys.path.append('/mypath/scriptlib') 
import scriptlib.abc 
import scriptlib.xyz 

def foo(): 
    ... some operations 

Se è così, è il valore solo per quel prompt dei comandi o è globale?

Grazie in anticipo

+1

Hai provato esso? Quel codice dovrebbe funzionare. Il nuovo valore di 'sys.path' è comunque locale al tuo programma (la variabile '$ PYTHONPATH' viene letta solo quando si avvia l'interprete per riempire' sys.path', non viene riscritta nell'ambiente). – filmor

+0

Sì, funziona – DKG

risposta

34

Questo aggiungerà un percorso per il processo di Python/istanza (vale a dire l'eseguibile in esecuzione). Il percorso non verrà modificato per altri processi Python. Un altro programma Python in esecuzione non avrà il suo percorso modificato, e se si esce dal programma e si esegue nuovamente il percorso non includerà ciò che è stato aggiunto in precedenza. Quello che stai facendo è generalmente corretto.

set.py:

import sys 
sys.path.append("/tmp/TEST") 

loop.py

import sys 
import time 
while True: 
    print sys.path 
    time.sleep(1) 

run: python loop.py &

Questo farà eseguire loop.py, collegato al vostro STDOUT, e continuerà a correre sullo sfondo. È quindi possibile eseguire python set.py. Ognuno ha un diverso insieme di variabili d'ambiente. Osservare che l'output da loop.py non cambia perché set.py non cambia l'ambiente di loop.py.

Una nota sull'importazione

importazioni Python sono dinamici, come il resto della lingua. Non c'è nessun collegamento statico in corso. L'importazione è una riga eseguibile, proprio come sys.path.append....

+0

ma non voglio il percorso nel mio codice. Voglio che il mio codice sia pulito e portatile. non c'è il concetto di un "progetto python". (Dire per Visual-studio-code o per Atom.io) ?! – pashute

+0

Sì, l'equivalente di un "progetto" Python è VirtualEnv. VirtualEnvWrapper è una bella interfaccia da usare. La differenza tra questo e Visual Studio è che esiste già un ambiente Python globale e virtualenv rende solo un livello virtuale in primo piano. Ci possono essere altri strumenti, sono stato lontano da Python per alcuni anni. – Joe

5

Come anche indicato nei documenti here.
Vai Python X.X/Lib e aggiungere queste righe al site.py lì,

import sys 
sys.path.append("yourpathstring") 

questo cambia il tuo sys.path in modo che su ogni carico, avrà quel valore in esso ..

Come affermato here su site.py,

Questo modulo viene importato automaticamente durante l'inizializzazione. L'importazione di questo modulo aggiungerà percorsi specifici del sito al percorso di ricerca del modulo e aggiungerà alcuni built-in.

Per altri possibili metodi di aggiungere un po 'di strada per sys.path vede these docs

+0

ma equivale a impostare manualmente il valore nelle variabili di ambiente. Ciò di cui ho bisogno è di cambiare abbastanza spesso il percorso della libreria come ottenere il percorso scriptlib da un file e impostarlo prima di usarli. – DKG

+0

No, questo valore viene aggiunto in ogni esecuzione di 'python.exe' poiché' site.py' viene caricato automaticamente durante l'inizializzazione. Quindi, non è necessario l''import sys sys.path.append .... ' in ogni file. – pradyunsg

+1

considera una situazione in cui ho 2 copie dello stesso script python. uno script vuole ottenere la libreria da C: \ testers \ scriptlib e altre richieste da D: \ developer \ scriptlib. In tal caso, come può determinare site.py per assegnare a quale percorso ea chi. – DKG

Problemi correlati