2013-03-22 19 views
5

Ho un pacchetto padre con 2 pacchetti figlio. Sembra che questoImpossibile importare moduli di pacchetti parent all'interno di pacchetti figlio

backend 
    __init__.py 
    conf.py 
    db.py 
    connections.py 
    /api 
     __init__.py 
     register.py 
     api.py 
    /scheduled 
     __init__.py 
     helpers.py 

All the __init__.py files are empty.

Il codice in backend/connections.py e backend/conf.py viene utilizzato dai moduli in entrambi i pacchetti api e scheduled.

in register.py ho codice come

from backend.conf import * 
from backend.connections import * 

Ora quando faccio python register.py ottengo questo errore

ImportError: No module named backend.conf 

Anche quando ho cambiato from backend.conf import * a from ..conf import * o from .. import conf ottengo questo errore

ValueError: Attempted relative import in non-package 

Quello che ho capito dall'errore sopra riportato è che Python non sta trattando le suddette cartelle come pacchetti. Ma ho __init__.py in tutte le cartelle. Che c'è?

+0

@MrE perché 'connections' non è un modulo? tutti i file '__init __. py' sono vuoti. – lovesh

risposta

5

Quando si esegue python register.py, il file backend/register.py viene utilizzato come modulo __main__ del programma, piuttosto che come modulo all'interno del pacchetto backend. Inoltre, il percorso di importazione di Python non includerà automaticamente la directory contenente la directory backend, che è probabilmente la causa dei tuoi problemi.

Un'opzione che potrebbe funzionare è eseguire il programma come python -m backend.register dalla directory di livello superiore del progetto (o impostare PYTHONPATH in modo che questo modulo possa essere trovato). Questo cercherà lo script nel normale percorso di importazione, quindi lo eseguirà come programma principale.

+0

@lovesh: in poche parole, non è possibile inserire un modulo principale in un sotto pacchetto. – martineau

+0

Come ho detto nella mia risposta, è possibile se si avvia il programma con 'python -m'. –

+0

Esattamente - una buona ragione per non provarlo - forse avrei dovuto dire "... non dovresti_ inserire un modulo principale in un sotto pacchetto". – martineau

Problemi correlati