如何公开导入的组件?

时间:2018-03-23 11:46:59

标签: python python-3.x module

我对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

正确的方法是什么?

1 个答案:

答案 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时加载子模块。