我试图以这种目录结构将模块导入包中。我发现了一件非常令人惊奇的事情,我找不到解释。
➜ test tree
.
├── main.py
└── package
└── module.py
如果main.py
是
import package
package.module
会有错误。
Traceback (most recent call last):
File "main.py", line 2, in <module>
package.module
AttributeError: module 'package' has no attribute 'module'
如果main.py
是
import package
from package import module
package.module
或
from package import module
import package
package.module
没有错误。
即使在__init__.py
中添加package
,结果也一样艰难
我不得不执行一个额外的命令来将模块导入包中,这很烦人。
我认为应该有一种优雅的方法来做到这一点,并且我也想知道这种现象的机理。预先感谢。
答案 0 :(得分:0)
Python认为您在执行import package
时正在导入模块,您也可以在异常描述中看到它(例如module 'package'
):
AttributeError: module 'package' has no attribute 'module'
您应该导入并直接查找模块:
from package import module
module
如果要特定的功能/类,请执行以下操作:
from package.module import Class
instance = Class()
关于您使用两个import语句观察到的内容,Python似乎保留了模块来源包的引用,因此当两个名称分别导入时,它允许链接名称。但实际上并不需要链接。如果要保留模块来源软件包的引用,请查阅module.__name__
属性,或使用as
:
from package import module as 'package_module'
print(package_module.__name__) # returns 'package.module'
虽然很丑。