2009-06-19 12 views
7

Sto provando a modificare sys.path in uno dei miei file Python in modo da avere alcune dirs di librerie specifiche nel percorso di ricerca dei moduli (potrebbe non essere il modo migliore ma ...). Se inserisco diversi percorsi nella parte anteriore di sys.path, il mio script non prende in considerazione quei percorsi per le importazioni future. Se faccio una lista completamente nuova contenente le librerie di cui ho bisogno e assegno quell'elenco a sys.path allora quelle importazioni sono prese in considerazione. È questo il comportamento corretto? Sto usando Python 2.5.4. Potrebbe essere qualcosa dal mio ambiente che potrebbe portare a un simile comportamento?Modifica Python sys.path non funzionante

alcuni frammenti di codice: Se faccio

 
pathtoInsert1 = " .... " 
pathtoInsert2 = " .... " 
sys.path.insert(0, pathToInsert1) 
sys.path.insert(0, pathToInsert2) 

esso non funziona. Non tiene conto dei percorsi.

Se faccio

 
pathList = [pathToInsert1, pathToInsert2] 
sys.path = pathList 

funziona.

Grazie

+4

si prega di inviare un po 'di codice che mostra come si sta aggiungendo i percorsi. –

risposta

2

Come stai "Inserimento" i percorsi aggiuntivi?

La modifica del percorso viene eseguita allo stesso modo in cui qualsiasi altro elenco in Python viene modificato, anche se sembra che lo stiate semplicemente rovinando riassociandolo.

Esempio di sys.path aggiornamento: http://www.johnny-lin.com/cdat_tips/tips_pylang/path.html

17

Hai davvero bisogno di inserire un codice per noi essere in grado di aiutarvi. Tuttavia, posso fare una supposizione istruita. Dici che se fai una lista completamente nuova e la assegni a sys.path allora funziona. Presumo che significa che si sta facendo qualcosa di simile

sys.path = ["dir1", "dir2", ...] 

Ma che se si inseriscono i percorsi all'inizio poi non funziona. La mia ipotesi è che tu stia utilizzando il metodo insert, ad esempio

sys.path.insert(0, ["dir1", "dir2"]) 

Se è così, questo non è corretto. Ciò creerebbe una lista che assomiglia

[["dir1", "dir2"], "dir3", ...] 

Si dovrebbe invece dire

sys.path[:0] = ["dir1", "dir2"] 

che vi darà

["dir1", "dir2", "dir3", ...] 

Ma questo è tutto congetture fino a quando si posta il proprio codice.

4

Esempio di aggiornamento sys.path preso da here

import sys 
sys.path.append("/home/me/mypy") 

Questo ha funzionato per me.

1

Ho appena avuto un problema simile mentre lavoravo in iPython con moduli distribuiti su più directory. In tal caso, per fare in modo che l'importazione funzioni, è necessario accertarsi che lo module.__path__ di moduli con __init__.py distribuito includa tutte le directory in cui uno dei moduli è __init__.py, oltre a verificare che la directory corretta sia presente nell'elenco sys.path.

Per esempio, ho un modulo chiamato foo, che contiene un modulo chiamato bar che si sviluppa su più directory:

aerith/foo/bar/__init__.py 
aerith/foo/bar/baz/__init__.py 
bob/foo/bar/__init__.py 
bob/foo/bar/baf/__init__.py 
carol/foo/bar/__init__.py 
carol/foo/bar/quux/__init__.py 

In ipython, avevo già importato Baz e BAF, e ha voluto importare quux .

from foo.bar import quux

Questo ha dato un'ImportError, perché carol non era in sys.path, ma sys.path.append('carol') non risolvere l'ImportError.

Quello che era necessario era informare il modulo bar che uno dei suoi __init__.py poteva essere trovato in "carol/foo/bar".

foo.bar.__path__.append('carol/foo/bar') 
from foo.bar import quux 
Problemi correlati