我对python很新,并且正在使用Python 3.5
我有这样的文件结构:
main.py
MyModule/
MyModule/__init__.py
MyModule/component.py
MyModule/component/
MyModule/component/__init__.py # blank
MyModule/component/subcomponent.py
在某些脚本中,我希望能够使用这两种方法中的任何一种来使用MyModule.component.subcomponent.myfunc()
:
import MyModule.component
result = MyModule.component.subcomponent.myfunc()
或
import MyModule.component.subcomponent
result = MyModule.component.subcomponent.myfunc()
我尝试让我的./MyModule/component.py
有以下内容,但它没有效果:
# This didn't expose the subcomponent stuff
from MyModule.component.subcomponent import *
# I tried this too, but it also didn't work
subcomponent = MyModule.component.subcomponent
正确的方法是什么?
答案 0 :(得分:3)
您有姓名冲突。您不能同时拥有component.py
和 component
个包。当Python导入MyModule.component
时,它会找到component.py
模块 或 component/__init__.py
包。 你不能同时拥有。
在OS X上的Python 3.7设置中,包赢:
$ mkdir -p demopackage/nested
$ cat > demopackage/nested.py <<EOF
> print('This is the nested.py module file')
> EOF
$ cat > demopackage/nested/__init__.py <<EOF
> print('This is the nested/__init__.py package file')
> EOF
$ python3.7 -c 'import demopackage.nested'
This is the nested/__init__.py package file
这意味着您的component.py
文件永远不会被执行。
将component.py
内容移至component/__init__.py
并在其中导入子模块。导入包的子模块时,该模块将自动成为属性。
所以你需要做的就是删除component.py
,然后你可以使用
import MyModule.component.subcomponent
在任何地方,此时import MyModule.component
就足以达到MyModule.component.subcomponent.myfunc()
。
请参阅导入系统上的Python参考文档的Submodules section:
当加载子模块 [...] 时,绑定将被放置在父模块的命名空间中,直到子模块对象。例如,如果包
spam
具有子模块foo
,则在导入spam.foo
后,spam
将具有绑定到子模块的属性foo
。
我在MyModule/component/__init__.py
文件的顶部使用了包相对导入:
from . import submodule
确保在导入MyModule.component
时加载子模块。