2015-07-08 8 views
11

Ich hatte vor kurzem ein Problem mit einem Python ImportError, wo das Modul gefunden wurde, wenn auf meinem lokalen Computer, aber nicht ausgeführt auf dem CI-Server gefunden. Ich löste dieses Problem, indem ich sys.path.append(path) in meinem Skript mit sys.path.insert(0, path) vertauschte, wo path die Position des Zeichenfolgenmoduls ist.Auswirkung der Verwendung von sys.path.insert (0, Pfad) und sys.path (append) beim Laden von Modulen

Da dies mein Modul und kein installiertes Paket ist (related question), warum behebt die Reihenfolge der Pfade dieses Problem?

+0

Mögliche Duplikate von [Warum sys.path.append (Pfad) anstelle von sys.path.insert (1, Pfad) verwenden?] (Http://stackoverflow.com/questions/10095037/why-use-sys- path-appendpath-anstelle-von-sys-path-insert1-path) – CrandellWS

Antwort

9

Weil Python die Verzeichnisse in sequenzieller Reihenfolge ab dem ersten Verzeichnis in der sys.path Liste eincheckt, bis es die .py Datei findet, nach der es gesucht hat.

Idealerweise ist das aktuelle Verzeichnis oder das Verzeichnis des Skripts das erste immer das erste Element in der Liste, es sei denn, Sie ändern es, wie Sie es getan haben. Von documentation -

As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter. If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first. Notice that the script directory is inserted before the entries inserted as a result of PYTHONPATH.

Also, höchstwahrscheinlich, Sie hatten eine .py Datei mit dem gleichen Namen wie das Modul, das Sie von importieren versuchen, im aktuellen Verzeichnis (in dem das Skript aus wurde ausgeführt).

Auch eine Sache über ImportError s zu beachten, kann sagen, die Importfehler sagen - ImportError: No module named main - es bedeutet nicht, die main.py überschrieben wird, nicht wenn das überschrieben wurde würden wir nicht Probleme werden mit versuchen, es zu lesen. Ein Modul darüber wurde mit einem überschrieben. py oder eine andere Datei.

Beispiel -

Meine Verzeichnisstruktur sieht aus wie -

- test 
    - shared 
     - __init__.py 
     - phtest.py 
    - testmain.py 

Jetzt ab testmain.py, ich from shared import phtest nennen, es funktioniert gut.

Jetzt kann sagen, dass ich ein shared.py in test directory` vorstellen, Beispiel -

- test 
    - shared 
     - __init__.py 
     - phtest.py 
    - testmain.py 
    - shared.py 

Jetzt, wenn ich versuche from shared import phtest von testmain.py zu tun, werde ich den Fehler -

ImportError: cannot import name 'phtest' 

Wie Sie oben sehen können, ist die Datei, die das Problem verursacht, shared.py, nicht phtest.py.

+0

Mein Modul war etwas.main, ich habe versucht, es zu etwas.engine zu ändern, um zu sehen, ob das das Problem war, aber ich hatte immer noch den ImportError, das macht mich denke, es war kein Modulname/Dateikonflikt. –

+0

Was war der Importfehler? –

+1

Die letzte Zeile des Traceback war "ImportError: Kein Modul namens main" –

6

Ich bin einen ganz Anfänger in Python, und ich fand die Antwort von Anand war sehr gut, aber ziemlich kompliziert für mich, so dass ich versuchen, neu zu formulieren:

1) insert und append Methoden sind nicht spezifisch auf sys.path und wie auch in anderen Sprachen, die sie ein Element in eine Liste oder einen Array hinzufügen und:
* append(item)item zum Ende der Liste, * insert(n, item) fügt die item an der n-ten Position in der Liste (0 am Anfang, 1 nach
hinzufügen das erste Element usw ...).

2) Wie Anand sagte, Python die Importdateien in jedem Verzeichnis des Pfades in der Reihenfolge des Weges suchen, so:
* Wenn Sie keine Dateinamendopplungen haben, die Reihenfolge des Wegs keinen Einfluss hat,
* Wenn Sie nach einer bereits im Pfad definierten Funktion suchen und append verwenden, um Ihren Pfad hinzuzufügen, erhalten Sie Ihre Funktion nicht, sondern die vordefinierte Funktion.

Aber ich denke, dass es besser ist, append und nicht insert zu verwenden, um das Standardverhalten von Python nicht zu überlasten, und nicht eindeutige Namen für Ihre Dateien und Methoden zu verwenden.