2013-08-16 2 views
14

Ho un pacchetto hello1 che contiene il modulo good.py.È possibile accedere alle variabili in __init__.py dai moduli nello stesso pacchetto?

hello1 
├── __init__.py 
└── good.py 

Il modulo init ha una variabile A = 1, e ho bisogno di accedere al hello1.A variabile good.py.

import hello1 

class Good(object): 
    def __init__(self): 
     print hello1.A 

if __name__ == "__main__": 
    g = Good() 

Il problema è che quando eseguo lo script python ho l'errore ImportError: 'No module named hello1'. Potrei aggiungere import sys; sys.path.append("..") alla prima riga di good.py per una soluzione rapida.

Tuttavia, il file good.py è nel pacchetto hello1 in cui è presente anche __init__.py, quindi mi chiedo se esiste un modo per accedere alle variabili in __init__.py dai moduli nello stesso pacchetto.

+1

Hai provato a passare alla directory contenente 'hello1' ed eseguendo lo script con' python hello1 \ good.py'?Inoltre, potresti trovare una risposta qui: http://stackoverflow.com/questions/436497/python-import-the-contain-package – flornquake

risposta

6

Da Python: import the containing package:

Importazione __init__ sembra funzionare bene.

import __init__ 

class Good(object): 
    def __init__(self): 
     print hello1.A 
+5

Non devi importare direttamente '__init__'. Invece, la directory genitore di 'hello1' dovrebbe essere elencata nel percorso di ricerca del modulo python e invece 'hello1' dovrebbe essere importato. –

+0

Se si usa 'python -m hello1.good', allora la directory di lavoro corrente viene aggiunta automaticamente al percorso; se questa è la directory genitrice di "ciao1", tutto funziona bene. –

+0

@MartijnPieters, non sempre. Se si dispone di un eseguibile situato all'interno del pacchetto e si dice che l'eseguibile vuole cercare il numero di versione del pacchetto situato in __init__.py, questo è esattamente ciò che si dovrebbe fare. – Cerin

0

Se non vi piace sys.path.append (...) è possibile eseguire lo script come

python -m hello1.good 

nella directory che contiene il "hello1" -directory o utilizzare la variabile d'ambiente PYTHONPATH invece di sys.path.

1

Se non sbaglio si vuole fare qualcosa di simile:

python hello1/good.py 

Dal good.py è un modulo di un pacchetto che si shouldn, 't eseguirlo direttamente; tieni presente che, quando lo esegui direttamente, non è considerato parte del pacchetto hello1, che impedisce le importazioni relative e la directory corrente è quella che contiene il file, quindi non è possibile trovare hello1 se non fa parte di il PYTHONPATH. Invece è possibile eseguirlo con l'interruttore -m dell'interprete Python:

-m mod: eseguire modulo di libreria come script (termina lista di opzioni)

Io personalmente non piace utilizzando le opzioni di interprete per eseguire un file python. Preferirei avere un file di avvio indipendente good.py che importi il ​​modulo hello1.good e lo utilizzi per fare ciò che deve fare.

0

È necessario importare in modo esplicito le costanti che si desidera utilizzare.

È preferibile avere tutte le costanti in un file "config" (ad esempio config.py) e quindi se le si desidera nello spazio dei nomi pacchetto, importarle.

init di file .py:

from package.config import * 

è più evidente in questo modo