【问题标题】:Python module search pathPython模块搜索路径
【发布时间】:2011-04-01 05:32:06
【问题描述】:

我有一个这样的项目:

foo/
| main.py
| bar/
| | module1.py
| | module2.py
| | __init__.py

main.py 执行 import bar.module1module1.py 执行 import module2

这适用于 python 2.6,但不适用于 python 3.1 (ImportError: No module named module2)

为什么行为会改变?怎么恢复?

【问题讨论】:

  • 你能显示你的 init.py 的内容吗?
  • 它是空的。事实上,要重现此行为,您只需将包含 import 语句的 main.py 和 module1.py 以及其他文件清空即可。
  • 这似乎是一个奇怪的结构,尽管我不经常将我的模块放入包中;为什么不在main.py 中有您关心的__init__.py 导入组件
  • 为什么这么奇怪?如果我在 init.py 中添加 import module1,它会以 (ImportError: No module named module1 in foo/bar/__init__.py) 结尾
  • 这看起来也很奇怪;不过如果你这样做了,我的回答也会治愈它。

标签: python path module


【解决方案1】:

在module1.py中,执行:from . import module2

main.py

import bar.module1
print(bar.module1.module2.thing)

bar/init.py

#

bar/module1.py

#import module2 # fails in python31
from . import module2 # intrapackage reference, works in python26 and python31

bar/module2.py

thing = "blah"

至于为什么/如何,这超出了我的工资等级。该文档似乎没有说明这一点。也许在 Python 3 中,他们决定强制使用包内样式显式导入包中的子模块?

【讨论】:

  • 也在What's new in Python 3.0 中引用:“相对导入唯一可接受的语法是from .[module] import name。所有不以. 开头的导入形式都被解释为绝对导入。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2015-04-07
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多