下面是我的项目示例。
运行foo.py时,我得到:
ModuleNotFoundError:没有名为“ foo.bar”的模块; 'foo'不是一个包
重命名foo /目录或foo.py文件可以解决此问题,但我很想知道是否还有另一种方式发生这种情况。
project/
|
foo/
| __init__.py
| foo.py
| bar.py
|
setup.py
在foo.py中
import foo.bar
if __name__=='__main__':
pass
答案 0 :(得分:2)
问题可能是您如何以脚本方式运行foo.py
。如果您从python foo.py
目录中运行project/foo
,Python将假设foo.py
是全局级别的模块,这将防止foo/
文件夹被视为全局包(即使project/
在模块搜索路径中)。它将期望也将bar.py
作为bar
在顶层导入,而不是作为foo
包中的模块导入。
您可能可以通过更改运行foo.py
的方式来解决此问题。尝试使用python foo.py
(如有必要,请从python -m foo.foo
文件夹中)来代替project/
。
也有可能通过在模块中设置__package__
值来解决某些问题(有关解释__package__
并提供一些有用链接的另一答案,请参见here)。不过,这可能只能解决软件包中模块之间的显式相对导入(因此您可以将import foo.bar
更改为from . import bar
并可以使用),但是我不确定它是否可以恢复{{1} }封装到其在全局名称空间中的适当位置(因此,封装外的其他代码可能仍会中断)。