2013-02-02 7 views
27

Ich habe ein Modul extended.py benannt, die die folgende Zeile enthält:‚Versuchte relativer Import in nicht-Paket‘, obwohl Pakete mit __init__.py in einem Verzeichnis

from .basic import BasicModule 

und die Datei basic.py in demselben Verzeichnis befindet wie tut __init__.py. Allerdings, wenn ich versuche, es laufen, wie:

python extended.py 

ich den Fehler:

ValueError: Attempted relative import in non-package 

Auch das Hinzufügen der Zeile:

from __future__ import absolute_import 

das Problem nicht lösen. Vielleicht bin ich zu müde, um das Offensichtliche zu sehen - aber ich sehe das Problem hier nicht.

+1

mögliches Duplikat von [Versuchter relativer Import in Nicht-Paket sogar mit \ _ \ _ init \ _ \ _. Py] (http://stackoverflow.com/questions/11536764/atempted-relative-import-in-non-no- package-even-with-init-py) – BrenBarn

+0

Wie wäre es mit 'python -m parent_directory.extended'? – SparkAndShine

+0

Mögliches Duplikat von [Wie man relative Importe in Python macht?] (Http://stackoverflow.com/questions/72852/how-to-do-relative-imports-in-python) –

Antwort

47

Relative Importe funktionieren nur für Pakete, aber wenn Sie in extended.py importieren, führen Sie stattdessen ein Top-Level-Modul.

Das aktuelle Verzeichnis enthält möglicherweise eine __init__.py Datei, aber das macht exended.py noch nicht Teil eines Pakets.

Damit etwas als Paket betrachtet werden kann, müssen Sie stattdessen den Verzeichnisnamen importieren. Die folgende funktionieren würde:

main.py 

packagename\ 
    __init__.py 
    basic.py 
    extended.py 

dann in main.py put:

import packagename.extended 

und nur dann ist extended Teil eines Pakets und tun relative Importe arbeiten.

Der relative Import hat jetzt etwas, relativ zu sein zu, der packagename Elternteil.

+3

Aber wie kann ich ' Unittests in diesem Fall? Muss ich für diese Importfälle ein Python-Argument (-m) angeben? – Alex

+0

Für alles, was nicht in einem Paket definiert ist, verwenden Sie keine relativen Importe, sondern absolute Importe. Ein Unittest-Skript ist nicht Teil des Pakets, es ist ein externes Skript. –

+0

Ich dachte immer, man sollte die Unittests in ein und demselben Modul einbauen? Gibt es eine gute Praxis oder eine PEP auf der Einheit mit Python? – Alex

Verwandte Themen