2011-11-16 17 views
5

Ho un progetto che assomiglia a questo:Python assoluto di importazione nel modulo non riesce

my_project/ 
      __init__.py -- empty 
      run.py 
      datacheck/ 
        __init__.py -- empty 
        datacheck.py -- containing class DataCheck(object) 
        config.py -- containing BusinessConfig(object) 
        business.py -- containing class BusinessCheck(DataCheck) 

mio PYTHONPATH è configurato per avere/my_project in esso.

In run.py, ho il seguente codice:

from datacheck.business import BusinessCheck 
business = BusinessCheck() 
business.check_data() 

In business.py, ho le seguenti importazioni che non riescono:

from datacheck.config import BusinessConfig 
from datacheck.datacheck import DataCheck 

Un import relativa come from .config import BusinessConfig opere - tuttavia Ho letto in numerosi thread che si preferisce un'importazione assoluta.

Per fare un semplice test, ho anche creato il seguente:

myproject/ 
      __init__.py -- empty 
      run_test.py 
      test/ 
       __init__.py -- empty 
       test1.py -- containing class Test1(object) 
       test2.py -- containing class Test2(Test1) 

importazioni run_test.py e gestisce la classe Test2, questo non ha fallito.

mi ha lasciato un po 'sbalordito, non capisco il motivo per cui i miei importazioni assolute in datacheck non funzionano - qualcuno può spiegare?

+0

'da datacheck.business importazione operazioni d'' ma business.py - contenente classe BusinessCheck (DataCheck) '... Dove è la classe' operazioni d'? – eumiro

+0

Avete anche un file '__init __. Py' in' datacheck'? Questo file rende la directory un pacchetto e può essere vuota. –

+0

@eumiro: scusa, piccolo errore - correggilo. –

risposta

6

Si consiglia di preferire importazioni assolute se il modulo può essere utilizzato come __main__, come spiegato nello documentation. In caso contrario, le importazioni relative vanno bene.

Queste importazioni non riescono, perché il pacchetto datacheck contiene un modulo datacheck (stesso nome). Quando si cerca il nome, Python guarda implicitamente all'interno del pacchetto. Lì, trova il modulo datacheck. Questo modulo, tuttavia, non contiene nulla con il nome config, quindi l'importazione non riesce.

Se si desidera utilizzare le importazioni assolute, spostare tutte le cose dal modulo datacheck nello __init__.py del pacchetto o rinominarlo.

+0

Che (datacheck in datacheck) è stato tutto insieme, non ho mai saputo che questo non era possibile! Grazie mille :-) –

+0

@SjaakTrekhaak: È possibile, ma crea un'ambiguità, quindi devi fare molta attenzione. –

2

So che questo è molti anni più tardi, ma per il bene degli altri che cercano qui, sono stato in grado di risolvere un problema simile con questo pezzo di codice:

from __future__ import absolute_import 

Dopo di che, le importazioni assoluti ha funzionato bene in Python 2.6 e 2.7.

Problemi correlati