python模块和包具有相同的名称

时间:2018-12-12 19:11:53

标签: python python-3.x

下面是我的项目示例。

运行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

1 个答案:

答案 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} }封装到其在全局名称空间中的适当位置(因此,封装外的其他代码可能仍会中断)。