2016-07-27 15 views
0

Ich habe Probleme zu verstehen, wie verschachtelte Importe in einem Python-Projekt funktionieren. Zum Beispiel:Verschachtelte `ImportError` auf Py3 aber nicht auf Py2

test.py 
package/ 
    __init__.py 
    package.py 
    subpackage/ 
     __init__.py 

test.py:

import package 

package/__init__.py:

from .package import functionA 

package/package.py:

import subpackage 

def functionA(): 
    pass 

In Python 3.5, wenn ichlaufenIch erhalte die folgenden Fehler, aber keinen Fehler in Python 2.7:

C:\Users\Patrick\Anaconda3\python.exe C:/Users/Patrick/Desktop/importtest/test.py 
Traceback (most recent call last): 
    File "C:/Users/Patrick/Desktop/importtest/test.py", line 1, in <module> 
    import package 
    File "C:\Users\Patrick\Desktop\importtest\package\__init__.py", line 1, in <module> 
    from .package import functionA 
    File "C:\Users\Patrick\Desktop\importtest\package\package.py", line 1, in <module> 
    import subpackage 
ImportError: No module named 'subpackage' 

Allerdings, wenn ich package.py mit Python 3.5 laufen. Ich bekomme überhaupt keinen Fehler.

Dies scheint mir fremd wie wenn package.py auf seine eigene Linie der import subpackage Arbeiten ausgeführt wird, aber mit ihm ‚run‘ wird (weiß nicht, ob dies die richtige Terminologie hier ist) durch die verschachtelten Import, die gleiche Linie kann subpackage nicht finden.

Warum gibt es in diesem Fall Unterschiede zwischen Python 2.7 und 3.5 und wie kann dies auf eine Weise gelöst werden, die sowohl für 2.7.x als auch für 3.x funktioniert?

denke ich, dies auf die Tatsache zurückzuführen sein könnte, dass import subpackage in der verschachtelten Import zählt als ein impliziter relativer Import in dem verschachtelten Import aber nicht, wenn package.py direkt ausgeführt wird, aber wenn ich import .subpackage stattdessen tun, bekomme ich diesen Fehler auf beide 2.7 und 3.5:

C:\Users\Patrick\Anaconda3\python.exe C:/Users/Patrick/Desktop/importtest/test.py 
Traceback (most recent call last): 
    File "C:/Users/Patrick/Desktop/importtest/test.py", line 1, in <module> 
    import package 
    File "C:\Users\Patrick\Desktop\importtest\package\__init__.py", line 1, in <module> 
    from .package import functionA 
    File "C:\Users\Patrick\Desktop\importtest\package\package.py", line 1 
    import .subpackage 
     ^
SyntaxError: invalid syntax 
+0

Sie sollten nicht versuchen, 'package.py' alleine auszuführen. – martineau

+0

Danke. Der Punkt war nur zu versuchen zu verstehen, warum "Unterpaket" auf die eine Art und nicht auf die andere Seite importiert werden konnte. Natürlich gibt es keinen Grund, 'package.py' zu starten. – pbreach

+1

In diesem Fall siehe [_Relative Importe zum milliardsten Mal_] (http://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time) – martineau

Antwort

2

sollten Sie verwenden:

from . import subpackage 

in package/package.py.

+2

@pylang was meinst du? – donkopotamus

+0

Welcher Teil von "in' package.py' "war unklar? Sie wissen, der mit 'Import-Unterpaket' drin in Ihrer Frage. – martineau