2013-02-02 12 views
27

Mam moduł o nazwie extended.py który zawiera następujący wiersz:„Próba importu w stosunku spoza pakietu” Chociaż opakowań z __init__.py w jednym katalogu

from .basic import BasicModule 

i plik basic.py mieszka w tym samym katalogu co robi __init__.py. Jednak, gdy próbuję go uruchomić jak:

python extended.py 

pojawia się błąd:

ValueError: Attempted relative import in non-package 

dodając także linię:

from __future__ import absolute_import 

nie rozwiązuje problemu. Może jestem zbyt zmęczony, aby zobaczyć oczywiste - ale nie widzę problemu tutaj.

+1

możliwy duplikat [Próba względnego importu w nie-pakiecie, nawet przy \ _ \ _ init \ _ \ _. Py] (http://stackoverflow.com/questions/11536764/attempted-relative-import-in-non- package-even-with-init-py) – BrenBarn

+0

co powiesz na 'python -m parent_directory.extended'? – SparkAndShine

+0

Możliwy duplikat [Jak zrobić import względny w Pythonie?] (Http://stackoverflow.com/questions/72852/how-to-do-relative-imports-in-python) –

Odpowiedz

47

Względne importowanie działa tylko w przypadku pakietów, ale w przypadku importowania w wersji extended.py używany jest zamiast tego moduł najwyższego poziomu .

Katalog bieżący może zawierać plik __init__.py, ale nie stanowi to jeszcze części pakietu.

Aby coś zostało uznane za pakiet, należy zaimportować nazwę katalogu o numerze. Poniższa będzie działać:

main.py 

packagename\ 
    __init__.py 
    basic.py 
    extended.py 

następnie umieścić w main.py:

import packagename.extended 

i tylko następnie jest extended częścią pakietu i zrobić import stosunku pracy.

Względny import ma teraz wartość względną do, rodzica packagename.

+3

Ale jak mogę uruchomić? unittests "w takim przypadku? Czy mam określić argument python (-m) dla tych przypadków importu? – Alex

+0

Dla czego nie zdefiniowano w pakiecie, nie używaj importu względnego, zamiast tego użyj bezwzględnego importu. Skrypt unittest nie jest częścią pakietu, jest to skrypt zewnętrzny. –

+0

Zawsze myślałem, że należy umieścić unittests wewnątrz tego samego modułu? Czy istnieje dobre praktyki lub PEP na unitest z python? – Alex

Powiązane problemy