2017-01-23 8 views
-1

Also habe ich mir verschiedene ähnliche Probleme hier gefragt, aber bis jetzt hat nichts für mich gearbeitet.Import-Modul von Kind-Ordner zum Eltern

Ich habe die folgende Datei Architektur:

\folder 
    __init__.py 
    supClass.py 
    script1.py 
    \sub 
     __init__.py 
     script2.py 

So in script2.py Ich versuche supClass zu importieren. Wenn ich gut verstanden habe, was ich in verwandten Themen gelesen habe, muss ich angeben, dass \folder Teil des PYTHONPATH ist.

So folgenden Beispiele ich las, kam ich mit diesem Stück Code oben:

if __name__ == '__main__' and __package__ is None: 
    from os import sys, path 
    sys.path.append(path.dirname(path.dirname(path.abspath(__file__)))) 

from test_package import supClass 

    a = supClass() 
    a.print_sup() 

Aber ich folgende Fehlermeldung erhalten:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 685, in runfile 
    execfile(filename, namespace) 
    File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 71, in execfile 
    exec(compile(scripttext, filename, 'exec'), glob, loc) 
    File "C:/Donnees/Programmes_Python/Developpement/Tests/test_package/sub/script.py", line 18, in <module> 
    from test_package import supClass 
ImportError: No module named test_package 

Ich überprüfte, dass \ Ordner jetzt Teil der ist PYTHONPATH

import sys 
print sys.path 

in meiner Konsole und es ist in Ordnung. Die Variable __package__ bleibt jedoch auf None festgelegt. Der Fehler, den ich bekomme, scheint zu sagen, dass mein \folder kein Modul ist. Ich verstehe nicht warum, vielleicht verwechsle ich Dinge zwischen "Paket" und "Modul".

Wie auch immer, wenn jemand eine Idee hat, würde es sehr geschätzt werden!

+1

Der * Eltern * von '\ Ordner' sollte auf 'PYTHONPATH' sein. Wenn Sie 'folder' ==' test_package' annehmen, können Sie 'from test_package import subClass' und' from test_package im import script2' verwenden. Beachten Sie, dass das Ausführen von Skripten aus Unterordnern problematisch ist (aber einfach, wenn Sie eine 'setup.py' Datei schreiben). Sehen Sie meine Antwort hier http://stackoverflow.com/a/41201868/75103 für weitere Informationen. – thebjorn

+0

Das funktioniert! Vielen Dank!Aber können Sie erklären, warum der Eltern von \ Ordner auf PYTHONPATH und nicht nur \ Ordner selbst sein sollte? –

+1

Da 'Ordner' Ihr * Paket * ist und' Ordner importieren' muss Python im Verzeichnis * suchen, das * 'Ordner' enthält. – thebjorn

Antwort

1

Die Eltern von \folder auf PYTHONPATH sein sollte. Sie können

from folder import subClass 

und

from folder.sub import script2 

Der Grund für die Eltern von folder sollte auf PYTHONPATH (und nicht folder selbst), dann tun, ist, weil folder Ihr Paket ist, und zu import folder Python Bedürfnisse im Verzeichnis mitfolder suchen.

Beachten Sie, dass das Ausführen von Skripten aus Unterordnern problematisch ist, aber einfach, wenn Sie eine setup.py-Datei schreiben. Siehe meine Antwort hier stackoverflow.com/a/41201868/75103 für weitere Informationen.

0

Haben Sie versucht, nur supClass zu importieren?

import supClass 

Oder versuchen Sie dies:

sys.path.append("../") 
import supClass 
+0

'import supClass' funktioniert nicht, und ich bekomme den 'Kein Modul namens supClass' Fehler, den ich bekomme, da supClass noch im selben Ordner wie script2 ist, kein Teil des PYTHONPATH. Die zweite Option führt zu demselben Fehler. Ich denke, es ist genauso wie mein Skript. –

+0

Aus welchem ​​Verzeichnis führen Sie die Python-Datei aus? Schreiben Sie, wie Sie das Programm starten. – Wonka

+0

Ich starte das Programm direkt von meiner IDE, also sollte es aus dem '\ sub' Verzeichnis sein, denke ich. –

0

Ich habe versucht, Ihre Hierarchie zu reproduzieren und dies funktioniert der Trick:

if __name__ == '__main__': 
    from os import sys, path 
    sys.path.append(path.dirname(path.dirname(path.abspath(__file__)))) 

    from supClass import supClass 
    a = supClass() 
    a.print_sup() 
+0

Ok ich habe das versucht und tatsächlich funktioniert es! Aber ich verstehe nicht, warum ich nicht direkt test_package importieren kann. Ich möchte direkt 'test_package' importieren, so dass ich seine '__init __. Py' verwenden könnte, die die 'from supClass import supClass-Anweisung' enthalten könnte –

+0

__init__.py ist eine Paketdatei. Warum willst du es nennen? Werfen Sie einen Blick auf die Dokumentation hier: https://docs.python.org/3/tutorial/modules.html#packages – al27091

+0

Kein '__init __. Py' ist nicht der Konstruktor der Klasse supClass(). supClass hat einen eigenen Konstruktor (eine Methode namens '__init__') definiert. Aber '__init __. Py' ist nur die Initialisierungsdatei, die benötigt wird, um den Ordner als Python-Paket zu definieren. –