2009-06-19 11 views
7

Ich versuche, die sys.path in einer meiner Python-Dateien zu modifizieren, um einige spezifische Bibliotheken dirs in den Modulen Suchpfad zu haben (es ist nicht der beste Weg sein könnte aber ...). Wenn ich mehrere Pfade vor sys.path anlege, berücksichtigt mein Skript diese Pfade für zukünftige Importe nicht. Wenn ich eine ganz neue Liste mache, die diese Bibliotheken enthält, die ich benötige, und diese Liste sys.path zuweisen, werden diese Importe berücksichtigt. Ist das das richtige Verhalten? Ich benutze Python 2.5.4. Könnte es etwas aus meiner Umgebung sein, das zu einem solchen Verhalten führen könnte?Python sys.path Modifikation nicht funktioniert

Einige Code-Schnipsel: Wenn ich

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

tun es nicht funktioniert. Es berücksichtigt die Pfade nicht.

Wenn ich tun

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

funktioniert es.

Danke

+4

Bitte poste einen Code, der zeigt, wie du die Pfade hinzufügst. –

Antwort

2

Wie fügen Sie die zusätzlichen Pfade ein?

Das Ändern des Pfades erfolgt auf die gleiche Weise, wie jede andere Liste in Python geändert wird - obwohl es sich anhört, als würde man es einfach durch Neuzuweisung verfälschen.

Beispiel für die Aktualisierung sys.path: http://www.johnny-lin.com/cdat_tips/tips_pylang/path.html

17

Sie müssen wirklich etwas Code schreiben für uns in der Lage sein, Ihnen zu helfen. Allerdings kann ich eine fundierte Vermutung abgeben. Sie sagen, wenn Sie eine ganz neue Liste erstellen und sie sys.path zuweisen, dann funktioniert es. Ich nehme an, Sie meinen, dass Sie so etwas wie dieses

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

tun aber, dass, wenn Sie die Pfade am Anfang einfügen dann funktioniert es nicht. Ich nehme an, dass Sie die Einfügemethode wie folgt verwenden:

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

Wenn ja, dann ist dies nicht korrekt. Dies würde eine Liste erstellen, die

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

Sie mögen

sieht stattdessen

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

sagen sollte, die Sie

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

geben Aber das ist alles Spekulation, bis Sie Ihren Code schreiben.

4

Beispiel für die Aktualisierung sys.path genommen von here

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

Das ist für mich gearbeitet.

1

Ich hatte gerade ein ähnliches Problem bei der Arbeit in iPython mit Modulen, die über mehrere Verzeichnisse verteilt sind. In diesem Fall muss man sicherstellen, dass die module.__path__ Module mit verteilten __init__.py alle Verzeichnisse enthält, in denen eines der Module __init__.py ist, sowie sicherstellen, dass das richtige Verzeichnis in der sys.path-Liste ist.

Zum Beispiel habe ich ein Modul namens foo, die ein Modul namens Leiste enthält, die sich über mehrere Verzeichnisse verteilt:

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 hatte ich bereits importiert baz und BAF und wollte quux importieren .

from foo.bar import quux

Dies ergab einen Import, weil carol nicht in sys.path war, aber sys.path.append('carol') behob nicht den Import.

Erforderlich war, das Modul bar darüber zu informieren, dass eines seiner __init__.py in "carol/foo/bar" gefunden werden kann.

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