2012-11-28 367 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