2014-09-28 73 views
0

在我的一个项目中,我有一个主目录(称为Directory_XYZ),它具有4个子目录“config”,“source”,“library”和“modules”。所有四个都有需要相互交流的python模块。我已在所有四个子目录中放置了空的__init__.py。但仍然有些模块相互隐藏。任何帮助表示赞赏。虽然使用了init.py,但隐藏了python模块

我在所有子目录下的所有python模块中设置sys路径。

lib_path = os.path.abspath('../modules') 
lib_path1 = os.path.abspath('../source') 
lib_path2 = os.path.abspath('../library') 
lib_path3 = os.path.abspath('../config') 
sys.path.append(lib_path) 
sys.path.append(lib_path1) 
sys.path.append(lib_path2) 
sys.path.append(lib_path3) 

当我从PQR.py的“modules”子目录下的“source”子目录中导入ABC.py时,它是隐藏的。

PQR.py具有以上sys路径代码和低于导入代码。

from ABC import * 

我做错了吗?

+0

'ABC'和'XYZ'之间的关系是什么? – Yoel 2014-09-28 19:59:20

+0

ABC和XYZ是不同目录中的2个不同的python模块。在ABC下定义的一些功能由XYZ使用。因此我需要将ABC导入XYZ。 – 2014-09-29 03:20:58

回答

0

空白文件需要命名为__init__.py。尝试一下,如果它仍然不起作用,请发表评论。

+0

谢谢,但空白文件已被命名为__init__.py。 – 2014-09-29 03:18:52

+0

虽然 – hd1 2014-09-29 04:00:16

0

首先请注意,提示Python指定的目录确实是可以导入的包的文件的名称是__init__.py而不是init.py。即__init__.py带有2个前导下划线和2个下划线,后面跟着.py后缀。

现在,为了解决您的问题,所有你需要做的是添加XYZsys.path(如果XYZ是在当前目录不是必需的),然后将一个空__init__.py文件下它。如您已正确完成,XYZ下的四个软件包还应包含一个空的__init__.py文件,但不需要将它们的路径添加到sys.path

然后你就可以在彼此从访问以下方式你的模块:

from XYZ.modules import <specific-module> 
from XYZ.source import <specific-module> 

如果您想在其包装与from package import *进口自动导入特定的模块,你必须更新包的__init__.py文件来定义__all__为包括所需模块的名称的列表,以下列方式:

__all__ = ["<specific-module-1>", "<specific-module-2>"] 

一旦做到这一点,只需导入packag e包含__init__.py文件,还会导入指定的模块。例如,如果modules目录包含的模块XY__init__.py文件定义:

__all__ = ['X'] 

那么语句from XYZ.modules import *自动进口“X”以及并使其在导入模块的命名空间X可用。

我建议你阅读Python's tutorial regarding modules and packagesPython's documentation on the import statement
This blog post也是一个有趣的阅读。

+0

它必须是'__init __。py'谢谢Yoel的详细回复!但我不明白一些事情。 ABC.py是python文件,“modules”是它所在的目录。 SO应该不是来自modules.ABC import *? – 2014-09-29 03:25:22

+0

因为我已经在我的路径中添加了“模块”并且也有__init__.py,所以当我从“ABC导入*”执行操作时,我认为我应该能够看到ABC.py及其下的所有函数。我也试过“from modules.ABC import *”,但是我得到错误“ImportError:No module named modules.ABC” – 2014-09-29 03:43:20

+0

请看我更新的答案。您应该验证'XYZ'是否在'sys.path'中,或者它是您当前的目录。一旦出现这种情况,您应该可以执行'from XYZ.modules import ABC'或'from XYZ.modules.ABC import *'。 – Yoel 2014-09-29 05:04:33

相关问题