2011-11-04 8 views
7

Ho controllato quante più pagine SO possibile e ho provato tutto quello che ho trovato, ma nessuna ha avuto successo. Ho anche controllato la pagina PEP per quanto riguarda l'importazione e ho provato ogni esempio, nessuno dei quali funzionava.Come importare un modulo da una cartella accanto alla cartella corrente?

Ho una cartella di test con test delle unità al loro interno e devo importare il modulo che voglio testare. I moduli si trovano in una cartella chiamata 'src' che si trova accanto alla cartella src.

Le cartelle/file sono qualcosa del tipo:

Project/
     src/
      stringbuilder.py 
      __init__.py 
     tests/
      stringbuilder_test.py 
      __init__.py 
     main.py 
     __init__.py 

Ho provato tutto quello che potevo: l'aggiunta di __init__.py per ogni cartella che farne un modulo compresa la cartella principale del progetto.

import src.module_to_test 
from ..src.module_to_test import function_to_test 
from ..src import module_to_test 

Ho provato tutte le altre combinazioni che hanno fallito. Sto iniziando a pensare che ci debba essere qualcosa di sbagliato nelle mie impostazioni o nella mia comprensione-- Pensavo che questo dovesse essere semplice.

Se si verificano errori evidenti, per favore fatemelo sapere.

from tests import stringbuilder 

messaggio di errore:

$ ./stringbuilder_test.py 
Traceback (most recent call last): 
    File "./stringbuilder_test.py", line 14, in <module> 
    from tests import stringbuilder 
ImportError: No module named tests 

Lo stesso errore si verifica per (ma i test = src):

from src import stringbuilder 
+0

"src" o "test"? Puoi darci maggiori dettagli sulla gerarchia di file e cartelle? – Nicolas

+0

Aggiunto un po 'nel post per provare a mostrare la gerarchia. –

+0

'dai test import stringbuilder' - basta guardare la struttura ad albero sopra per vedere perché non funziona –

risposta

3

Se gli script vengono eseguiti all'interno di un pacchetto, è necessario utilizzare vari hack per far funzionare correttamente le importazioni. Probabilmente il più comune di questi è quello di manipolare sys.path:

import sys, os 

sys.path.insert(0, 
    os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 

from src import stringbuilder 

del sys.path[0] 

Non v'è alcun modo per raggiungere questo usando le normali istruzioni import.

Una soluzione generalmente migliore è semplicemente evitare di eseguire gli script nei pacchetti del tutto. Invece, metti tutti gli script all'esterno del pacchetto in una directory contenente. Dato che la directory dello script attualmente in esecuzione viene automaticamente aggiunta all'inizio di sys.path, questo garantirà che il pacchetto possa essere sempre importato direttamente, indipendentemente da dove viene eseguito lo script.

Quindi la struttura di directory potrebbe essere simile a questo:

project/
    package/
     __init__.py 
     src/
      __init__.py 
      stringbuilder.py 
     tests/
      __init__.py 
      stringbuilder_test.py 
    main.py 
    test.py 

Lo script test.py può quindi importare i suoi test in questo modo:

from package.tests import stringbuilder_test 

E stringbuilder_test.py possibile importare i moduli src in questo modo:

from package.src import stringbuilder 
-3

Aggiungi cartella alla vostra PATH.

+2

Ouch! Che idea terribile. –

+0

Aggiungerlo a PYTHONPATH è leggermente meno terribile, ma manca il punto della domanda. L'aggiunta al PERCORSO non aiuta minimamente. – geoffspear

0
from folder import my_module 

Se c'è un file __init__.py in folder.

+0

Questo errore, ha detto che non esiste una cartella con nome modulo. –

+0

Ehm, penso che dovevi sostituire 'cartella' con il nome della tua cartella! –

+0

Ho provato, lo stesso errore. :( –

Problemi correlati