我目前有目录结构
- module
- __init__.py
- foo.py
- bar.py
我想使用foo.py
和bar.py
中的函数定义,所以写了这个:
import module
module.foo.fooFunction()
module.bar.barFunction()
但是我收到错误'module' object has no attribute 'foo'
。
这有什么问题?
答案 0 :(得分:3)
首先,它应该是__init__.py
,而不是init.py
。现在,__init__.py
是设置模块命名空间的原因。
如果__init__.py
为空,那么要使用fooFunction
,您还需要导入foo
。它不会自动导入module
。:
import module.foo
module.foo.fooFunction()
如果您不喜欢,可以这样做:
# __init__.py
import foo
import bar
# script
import module
module.foo.fooFunction()
看看那里发生了什么?自从__init__.py
导入foo
后,当您import module
时,它会将foo
和bar
导入其命名空间。因此,当您在脚本中访问它时,module
已经将foo
子模块导入其命名空间。
您甚至可以从foo或bar直接将名称导入模块命名空间:
# __init__.py
from foo import fooFunction
# script
import module
module.fooFunction()
答案 1 :(得分:0)
在__init__.py
文件中(注意下划线 - 你的没有它们),你必须import from
你的子模块。
在mymod/__init__.py
:
from mysubmod1 import f
from mysubmod2 import g
在outside.py
:
from mymod import f, g
答案 2 :(得分:0)
模块只是父文件夹,不是真正的模块。如果 init .py为空,则必须执行此操作:
import module.foo。
module.foo.foofunc()
答案 3 :(得分:0)
不要忘记'作为' Python关键字。对于场景
- module
- __init__.py
- foo.py
- bar.py
另一种解决方案是:
import module.foo as someAlias
# this can then be called as
someAlias.fooFunction()
其中someAlias可以是你选择的任何东西。正如你所看到的那样,它比写出'module.foo.fooFunction()'
更简洁