【发布时间】:2020-05-06 12:42:09
【问题描述】:
我有一个使用buildout 设置的Python 2 Pyramid 应用程序和一个使用Mr.Developer 激活的项目文件夹;我正在尝试 futurize 这个项目作为 Python 3 迁移的一部分,该迁移发生了变化:
import test
到:
from __future__ import absolute_import
from . import test
但是由于某种原因./bin/pserve development.ini 没有出现,它说:
...
File "/apps/src/project/engine/config.py", line 3, in <module>
import utilities
File "/apps/src/project/engine/utilities.py", line 9, in <module>
from project.engine import spreadsheets
File "/apps/src/project/engine/spreadsheets.py", line 16, in <module>
from project.engine import utilities
ImportError: cannot import name utilities
据我所知,这是一个合适的包,因为它确实有一个 setup.py,我又运行了 develop activate project + buildout。
如果我在该代码中输入print(__package__),它会打印正常,但如果我添加一行from __future__ import absolute_import,它会打印None。 future 的 absolute_import 是否可以简单地清除 __package__ 变量,这就是它没有将其检测为包的原因吗?
这是真正问题的 MWE:Why does this circular import fail in Python 2 but not in Python 3?,当循环导入时,这似乎是 Python 2 中的一个错误。如果有人有干净的解决方案,请告诉我。
【问题讨论】:
-
为什么
__package__设置为None有问题?这是一个内部细节,被导入机制用来解析相关导入,请参阅python.org/dev/peps/pep-0366。 -
因为我想在下一行做
from . import test? -
这不是问题。如果
__package__是None,则导入机器知道计算它。 -
(我对
None的断言是错误的,当不在包中时它被设置为'',None只是一个“未设置”的标记)。 -
为什么它不是一个包?我们确实有
setup.py,我使用develop activate project并重新运行buildout(所有标准源代码激活内容)。它是否与 buildout 做事的方式有关(所有sys.path的东西)?我需要无缝开发这个包并将它部署为一个鸡蛋future的absolute_import?如果你愿意,我可以创建一个 MWE;但我想知道我是否缺少一些微不足道的东西。
标签: python-2.x pyramid buildout