2012-01-30 9 views
9

C'è un modo per importare i moduli con dipendenze all'interno della stessa directory usando un percorso assoluto/relativo con "imp"?Come importare i moduli con dipendenze nello stesso percorso assoluto/relativo con imp?

di seguito riportata la struttura delle directory:

. 
├── importFrom 
│   ├── dependant.py 
│   └── dependence.py 
└── test.py 

importazioni di file test.py dependant.py utilizzando:

modname=imp.load_source("testImp","importFrom/dependant.py") 

che a sua volta le importazioni dependence.py direcly con:

import dependence 

La chiamata a test.py restituisce

Traceback (most recent call last): 
    File "test.py", line 3, in <module> 
    modname=imp.load_source("testImp","importFrom/dependant.py") 
    File "importFrom/dependant.py", line 1, in <module> 
    import dependence 
ImportError: No module named dependence 

Può essere utile avere load_source aggiungere il percorso al modulo caricato nel caricatore in modo che trovi automaticamente le relative dipendenze. Per ora l'unica alternativa che ho trovato è l'aggiunta al percorso di sistema, mettendo in test.py

Edit: ho trovato un modo migliore per fare l'importazione relativa con il percorso, ha aggiunto il file per ottenere il percorso assoluto del chiamante (indipendenza dalla directory di lavoro corrente)

sys.path.append(os.path.join(os.path.dirname(__file__), 'importFrom')) 
import dependant 

risposta

0

IMO questo non è possibile con load_source che non esegue le operazioni necessarie in modo che l'importazione nel file 'dependant.py' consideri la directory principale.

Si dovrebbe o fare ciò che sono state suggerite (__init__.py nella directory e l'importazione assoluta nel modulo), o utilizzare di livello inferiore funzioni find_module/load_module che permette questo genere di cose (vedi find_module 'percorso' argomento)

+0

utilizzando tup = imp.find_module ("dipendente", ["/ opt/importFrom /", "altro"]) imp.load_module ("dipendente", tup [0], tup [1], tup [2]) riporta lo stesso errore "Nessun modulo denominato dipendenza". – a1an

+0

Penso anche che non sia fattibile con load_source a partire da python 2.7, quindi la risposta corretta è "non fattibile", bisogna usare un approccio di workaround – a1an

0

È necessario avere __init__.py in importFrom directory.

In [5]: ls importFrom/ 
dependance.py dependant.pyc dependence.pyc __init__.pyc 
dependant.py dependence.py __init__.py 

In [6]: from importFrom import dependant 

In [7]: dependant.dependence 
Out[7]: <module 'importFrom.dependence' from 'importFrom/dependence.py'> 

Invece di importare dependant in test, ho usato interprete Python per mostrare l'uscita. In dependant.py, viene importato dependance.

+1

Ciò consente di evitare di aggiungere al percorso per un'importazione standard, ma non funziona con imp.load_source, inoltre penso che non funzionerebbe anche se il modulo da importare si trova in una directory completamente diversa – a1an

+0

per creare un file __init__.py nella directory importFrom? – Kracekumar

+0

Ho creato __init__.py e ho inserito un'importazione importFrom.dependant in test.py che funziona. Funziona ancora perché la directory importFrom è figlia diretta della directory che contiene test.py un percorso assoluto non può essere specificato in un'importazione standard. – a1an

Problemi correlati