2012-11-28 9 views
13

Mam następujący układ plików:moduły importu z różnych folderów

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

chciałem zaimportować modułów A i b.py do main.py. Do tego stosuje się następujące polecenia w main.py:

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

Jednakże mogę importowania modułów folderu folder1 (podobnie do folderu folder2). pojawia się błąd:

No module named files.folder1 

nie mogę użyć polecenia import gdyż istnieje wiele plików Python w folder1 folder2 ... tak dalej.

Czy tu czegoś brakuje?

Odpowiedz

18

Kiedy zrobić to w Pythonie 2.7 używam:

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

import a 
import a1 

UPDATE

Oto hack Zbudowałem zaimportować wszystkie moduły w katalogu do słownika:

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) 

Po prostu to zbudowałem i jest bardzo hacky, ale może być bardziej jak coś, co chcesz. Tak więc, aby uzyskać dostęp do modułu, który chcesz, zamiast mówić module_name.thing powiedziałbyś modules["module_name"].thing

+0

Zgadzam się jednak, czy zapisywanie wielu instrukcji importowania nie jest uciążliwe, jeśli masz dużą liczbę plików? – user741592

+0

@ user741592: Dlaczego dzielisz swój kod pomiędzy wiele plików? Powinieneś pogrupować odpowiednie rzeczy w jeden moduł. – BrenBarn

+0

Niestety, istnieje wymóg podziału kodu. Byłbym szczęśliwy, mogąc pogrupować porcję w jeden plik. – user741592

1

Jeśli dodać folder1 do ścieżki, która nie oznacza, że ​​można importować folder1 jako moduł. Oznacza to, że możesz zaimportować pliki do folderu folder1. Więc można zrobić:

import a 
import a1 

Jeśli chcesz mieć folder1 być pakiet, który a i a1 są moduły, trzeba umieścić w folder1__init__.py a następnie zrobić import folder1. Jeśli chcesz mieć możliwość wykonywania from folder1 import * i mieć ten import a i a1, musisz umieścić kod w swoim __init__.py, który importuje a i a1.

Jeśli masz dużo plików w folderze, które chcesz importować w uporządkowany sposób, powinieneś zrobić ten folder w pakiecie.

2

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

wierzę część brakuje jest __init__.py plik w każdym z folderów. Plik ten powinien zawierać zmienną __all__, która zawiera listę wszystkich submodułów, które zostaną zaimportowane przez: from somepackage.subpackage import *.

Wszystko to jest elegancko wyjaśnione w Python Tutorial section on Packages.

Nadzieja to pomaga :-)

26

szybką odpowiedź:

Dodaj plik __init__.py (może być puste) do folderów plików, folder1 i folder2. Następnie otrzymałeś pakiet plików z paczek podrzędnych folder1 i folder2. Następnie można zaimportować z pliku main.py w ten sposób:

from files.folder1 import * 
+2

Ładna prosta odpowiedź! –

+0

załóżmy, że jeśli moja struktura folderów jest podobna do dataaccess.service/services.py, teraz jak zaimportować tę ścieżkę? – tiru

Powiązane problemy