2013-02-02 7 views
27

Ho un modulo chiamato extended.py che contiene la seguente riga:'importazione relativa Tentativo in non-pacchetto' anche se i pacchetti con __init__.py in una directory

from .basic import BasicModule 

e il file basic.py risiede nella stessa directory fa __init__.py. Tuttavia, quando provo a farlo funzionare come:

python extended.py 

ottengo l'errore:

ValueError: Attempted relative import in non-package 

aggiungendo Anche la linea:

from __future__ import absolute_import 

non risolve il problema. Forse sono troppo stanco per vedere l'ovvio - ma non vedo il problema qui.

+1

possibile duplicato di [Tentativo importazione relativa in non-pacchetto anche con \ _ \ _ init \ _ \ _. Py] (http://stackoverflow.com/questions/11536764/attempted-relative-import-in-non- package-even-with-init-py) – BrenBarn

+0

come dire 'python -m parent_directory.extended'? – SparkAndShine

+0

Possibile duplicato di [Come fare importazioni relative in Python?] (Http://stackoverflow.com/questions/72852/how-to-do-relative-imports-in-python) –

risposta

47

importazioni rispetto funzionano solo per i pacchetti, ma quando si importazione extended.py si esegue un modulo di di livello superiore invece.

La directory corrente può contenere un file __init__.py ma che non fa ancora parte di un pacchetto con exended.py.

Per qualcosa da considerare un pacchetto, è necessario importare il nome della directory. Questa situazione funziona:

main.py 

packagename\ 
    __init__.py 
    basic.py 
    extended.py 

poi main.py messo:

import packagename.extended 

e solo allora è extended parte di un pacchetto e lo fanno importazioni rispetto funzionano.

L'importazione relativa ora ha qualcosa da essere relativa a, il genitore packagename.

+3

Ma come sono in grado di eseguire ' unittests' in quel caso? Devo specificare un argomento python (-m) per questi casi di importazioni? – Alex

+0

Per qualsiasi cosa non definita in un pacchetto, non utilizzare le importazioni relative, utilizzare invece le importazioni assolute. Uno script unittest non fa parte del pacchetto, è uno script esterno. –

+0

Ho sempre pensato che uno dovrebbe mettere gli unittests all'interno dello stesso modulo? C'è una buona pratica o un PEP sul più unitario con Python? – Alex