使用init.py隐藏的python模块

时间:2014-09-28 19:45:06

标签: python python-import

在我的一个项目中,我有一个主目录(比如Directory_XYZ),它有4个子目录“config”,“source”,“library”和“modules”。这四个都有python模块,需要相互通信。我在所有四个子目录中都放置了空__init__.py。但仍有一些模块互相隐藏。任何帮助表示赞赏。

我在所有子目录下的所有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)

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

PQR.py上面有sys路径代码,下面是导入代码。

from ABC import *

我做错了吗?

2 个答案:

答案 0 :(得分:0)

空白文件需要命名为__init__.py。试试看,如果它仍然无效,请发表评论。

答案 1 :(得分:0)

首先请注意,提示Python指定目录确实是可以导入的包的文件名是__init__.py而不是init.py。也就是说,__init__.py.py后缀之前有2个前导下划线和2个附加下划线。

现在,为了解决您的问题,您需要做的就是将XYZ添加到sys.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>"]

完成后,只需导入包含该__init__.py文件的包,也可以导入指定的模块。例如,如果modules目录包含模块XY以及定义的__init__.py文件:

__all__ = ['X']

然后声明from XYZ.modules import *会自动导入&#39; X&#39;同样也可以在导入模块的命名空间中将其作为X

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