2012-11-28 20 views
13

Ho seguito disposizione dei file:Importa i moduli da cartelle diverse

python 
    |--main.py 
    |files 
     |-----folder1 
       |-----a.py,a1.py..... 
     |-----folder2 
       |-----b.py,b1.py.... 

ho voluto importare il mio moduli A e b.py a main.py. Per questo ho utilizzato i seguenti comandi in main.py:

a = 'C:/python/files/folder1' 
    sys.path.insert(0, a) 
    from files.folder1 import * 

tuttavia, sono in grado di importare i moduli da cartella1 (in modo simile per cartella2). ottengo un errore:

No module named files.folder1 

non posso usare comando di importazione in quanto vi sono molti file python in cartella1, cartella2 ... così via.

Mi manca qualcosa qui?

risposta

18

Quando faccio questo in Python 2.7 che uso:

import sys 
sys.path.append('C:/python/files/folder1') 

import a 
import a1 

UPDATE

Ecco un trucco che ho costruito per importare tutti i moduli in una directory in un dizionario:

import os 
import sys 

dir_of_interest = 'C:/python/files/folder1' 
modules = {} 

sys.path.append(dir_of_interest) 
for module in os.listdir(dir_of_interest): 
    if '.py' in module and '.pyc' not in module: 
     current = module.replace('.py', '') 
     modules[current] = __import__(current) 

L'ho appena creato ed è estremamente hacky ma potrebbe essere più simile a qualcosa che vuoi. Quindi, per accedere al modulo che si desidera, invece di dire module_name.thing si direbbe modules["module_name"].thing

+0

Sono d'accordo, tuttavia, non è ingombrante scrivere molte istruzioni di importazione se si dispone di un numero elevato di file? – user741592

+0

@ user741592: Perché dividi il tuo codice tra più file? Dovresti raggruppare le cose rilevanti insieme in un modulo. – BrenBarn

+0

Sfortunatamente, è necessario dividere il codice. Sarei stato felice di raggruppare il blocco in un singolo file. – user741592

1

Se si aggiunge folder1 al percorso, questo non significa che è possibile importare folder1 come modulo. Significa che puoi importare i file all'interno di folder1. Così si potrebbe fare:

import a 
import a1 

Se si desidera avere folder1 essere un pacchetto di cui a e a1 sono moduli, è necessario porre in __init__.pyfolder1 e poi fare import folder1. Se si desidera inoltre poter eseguire from folder1 import * e disporre dell'importazione a e a1, è necessario inserire il codice nel proprio __init__.py che importa a e a1.

Se si dispone di molti file in una cartella che si desidera poter importare in modo strutturato, è necessario trasformarla in un pacchetto.

2

I cannot use import command as there are many python files in folder1,folder2...so on. Am I missing something here?

Credo la parte che manca è il file di__init__.py in ciascuna delle cartelle. Tale file deve includere una variabile __all__ che elenca tutti i sottomoduli che verranno importati da: from somepackage.subpackage import *.

Questo è tutto elegantemente spiegato nel Python Tutorial section on Packages.

Spero che questo aiuti :-)

26

Risposta rapida:

aggiunge un file __init__.py (può essere vuoto) alle cartelle file, cartella1 e cartella2. Quindi hai un pacchetto file con sotto-pacchetti cartella1 e cartella2. Dopo questo è possibile importare da main.py in questo modo:

from files.folder1 import * 
+2

Bella risposta semplice! –

+0

supponiamo che la mia struttura di cartelle sia come dataaccess.service/services.py, ora come importare questo percorso? – tiru

Problemi correlati