2012-11-28 49 views
13

我有以下安排:導入模塊

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

我想導入我的模塊和b.py到main.py.爲此,我使用下面的命令在main.py:

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

不過,我無法從文件夾1(同樣的文件夾2)導入模塊。 我得到一個錯誤:

No module named files.folder1 

我不能使用進口的命令,因爲在文件夾1許多蟒蛇的文件,文件夾2 ...等等。

我在這裏錯過了什麼嗎?

回答

18

當我做這在Python 2.7我使用:

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

import a 
import a1 

UPDATE

這裏是一個黑客我建導入所有模塊的目錄到詞典:

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) 

我剛剛構建它,它非常黑,但它可能更像你想要的東西。所以,要訪問的,而不是說module_name.thing你會說modules["module_name"].thing

+0

但是我同意,如果你有大量的文件,編寫很多導入語句不是很麻煩嗎? – user741592

+0

@ user741592:你爲什麼要在多個文件之間分割你的代碼?你應該將相關的東西組合成一個模塊。 – BrenBarn

+0

不幸的是,需要分割代碼。我會很樂意將塊分組到一個文件中。 – user741592

1

如果添加folder1的路徑,這並不意味着你可以導入folder1作爲一個模塊所需的模塊。這意味着您可以導入folder1內的文件。所以,你可以這樣做:

import a 
import a1 

如果你想有folder1是一個包,其中的aa1的模塊,你需要把一個__init__.pyfolder1然後做import folder1。如果您還希望能夠執行from folder1 import *並且具有該導入aa1,則需要在__init__.py的代碼中輸入aa1

如果您希望能夠以結構化方式導入文件夾中的許多文件,則應將該文件夾放入一個包中。

2

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

我相信你缺少的部分是__init__.py文件中的每個文件夾。該文件應包含一個__all__變量,該變量列出將通過以下方式導入的所有子模塊:from somepackage.subpackage import *

這一切都在Python Tutorial section on Packages優雅地解釋。

希望這有助於:-)

26

快速解答:

添加文件__init__.py(可以爲空)文件夾文件文件夾1文件夾2。然後你得到一個包文件與子包文件夾1文件夾2。在這之後,你可以像這樣從main.py導入:

from files.folder1 import * 
+2

很簡單的答案! –

+0

假設我的文件夾結構像dataaccess.service/services.py,現在如何導入這個路徑? – tiru