2017-05-15 2 views
0

ich ein sehr seltsames Problem begegnet:importieren Python-Datei in ein anderes Verzeichnis fehlgeschlagen

Meine Dateistruktur ist wie: (Kern und Test sind Verzeichnisse)

core 
    ----file1.py 

    ----__init__.py 

test 

    ----file2.py 

in file2, ich schrieb:

from core import file1 

Ergebnis ist:

ImportError: cannot import name file1 
+0

Haben Sie einen relativen Import wie aus '..core import file1' versucht? –

Antwort

2

Erstellen Sie __init__.py Datei im Test-Verzeichnis:

Weil die __init__.py Dateien erforderlich sind, damit Python die Verzeichnisse als enthaltende Pakete behandeln.

parent/ 
    child1/ 
     __init__.py 
     file1.py 

    child2/ 
     __init__.py 
     file2.py 

Aus dem Fehler:

Wenn die child2/file2.py Datei direkt ausgeführt werden. Sie können nicht auf child1/file1.py von child2/file2.py

zugreifen, da nur aus dem übergeordneten Verzeichnis auf das Kind zugreifen kann.

Wenn eine Ordnerstruktur wie:

parent/ 
    child1/ 
     __init__.py 
     file1.py 
    child2/ 
     __init__.py 
     file2.py 
    file3.py 

Wenn wir die file3.py Datei ausführen. Kann child1/file1.py, child2/file2.py in file3.py
zugreifen, da es vom übergeordneten Verzeichnis ausgeführt wird.

Wenn wir child1/file1 von child2/file2.py zugreifen müssen, brauchen wir das übergeordnete Verzeichnis setzen:

Durch diese unter Befehl ausführen wir es erreichen können ...

PYTHONPATH=. python child2/file2.py 

PYTHONPATH=. Es bezieht sich die übergeordnete Pfad . Dann läuft child2/file2.py Datei aus dem Shell

+0

Entschuldigung. Versucht, aber gescheitert. immer noch, dass ImportError – wjxiz

+0

die Details des Problems aktualisiert. –

0

Wenn ich Ihren Fall versucht, ich habe

Traceback (most recent call last): 
    File "file2.py", line 3, in <module> 
    from core import file1 
ImportError: No module named core 

Der Grund dafür ist, dass Python nicht core findet. In diesem Fall müssen Sie core zum Systempfad hinzufügen, wie unten dargestellt (fügen Sie sie gleich am Anfang von file2.py):

import sys,os 
sys.path.append(path_to_core.py) 

Oder, wenn Sie es mit der Befehlszeile laufen würden, könnte man einfach gesagt folgendes zu Beginn des file2.py

import sys,os 
sys.path.append(os.path.join(os.path.dirname(__file__),'../')) 

Hier os.path.join(os.path.dirname(__file__),'../') ist es, den Weg zu file2.py zu äußern.

1

Es ist kein seltsames Problem, Importe funktionieren einfach nicht so.

Von der offiziellen Dokumentation: https://docs.python.org/3/tutorial/modules.html

When a module named spam is imported, the interpreter first searches for a built-in module with that name. If not found, it then searches for a file named spam.py in a list of directories given by the variable sys.path. sys.path is initialized from these locations:

  • The directory containing the input script (or the current directory when no file is specified).
  • PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH).
  • The installation-dependent default.

Sie in relative Importe aussehen könnten, ist hier eine gute Quelle: https://stackoverflow.com/a/16985066/4886716

Die relevanten Informationen von dieser Stelle sind, dass es keine gute Möglichkeit, es zu tun, es sei denn Sie fügen core zu PYTHONPATH wie Shawn hinzu. L sagt.

+0

hey, danke mann. Ich habe ein Verzeichnis namens "core-2" in "core", und die Python-Datei in core-2 kann Datei1 erfolgreich importieren (Datei1 ist in "core"). Nach dem Tuto sollte es das nicht können. Ich missverstehe irgendwo? – wjxiz

+0

Das hört sich an, als würde es funktionieren, ja ... Um ehrlich zu sein, bin ich mir auch nicht sicher. Vielleicht könnte der zweite Link, den ich gepostet habe, hilfreich sein, ich denke, er spricht das an. – Oersted

Verwandte Themen