在我的一个项目中,我有一个主目录(比如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 *
我做错了吗?
答案 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
目录包含模块X
和Y
以及定义的__init__.py
文件:
__all__ = ['X']
然后声明from XYZ.modules import *
会自动导入&#39; X&#39;同样也可以在导入模块的命名空间中将其作为X
。
我建议你阅读Python's tutorial regarding modules and packages和Python's documentation on the import statement This blog post也是一本有趣的读物。