【问题标题】:Can future's absolute_import clear __package__? [closed]未来的absolute_import可以清除__package__吗? [关闭]
【发布时间】: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,它会打印Nonefutureabsolute_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 的东西)?我需要无缝开发这个包并将它部署为一个鸡蛋futureabsolute_import?如果你愿意,我可以创建一个 MWE;但我想知道我是否缺少一些微不足道的东西。

标签: python-2.x pyramid buildout


【解决方案1】:

__package__ 设置为None 时,这只是尚未设置的标志值。这不是问题。

来自PEP 366 – Main module explicit relative imports,主题为__package__

当导入系统在未设置__package__(或设置为None)的模块中遇到显式相对导入时,它将计算并存储正确的值(__name__.rpartition('.')[0] 用于普通模块,__name__用于包初始化模块)。如果已经设置了__package__,那么导入系统将优先使用它,而不是根据__name____path__ 属性重新计算包名。

如果您在 主模块 中看到此设置为 None,并且它是包的一部分,请自行设置:

if __name__ == "__main__" and __package__ is None:
    __package__ = "foo.bar.baz"

【讨论】:

  • __name__ 也不会 __main__ 因为我不将它作为 脚本t 运行; pserve 运行它,它实际上与import 一起引发错误。 (对不起,我是一个完全的菜鸟,只是想弄清楚事情。)
  • @Nishant:抛出 what 错误?您没有提到任何有关错误的内容,只是询问 __package__ 是否可以最终设置为 None
  • 已更新,如果您也同意这应该可行,我将在 MWE 上工作。我不想让你在这上面浪费任何时间,因为这对我来说像是一个X-Y 问题;特别是由于buildout 并发症。
  • @Nishant:抱歉,这不是一个有用的更新,关于此错误发生的位置的信息为零,错误消息没有所有上下文。
  • 让我这样做@Martijn Pieters,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 2015-10-06
  • 2013-02-10
  • 2022-01-03
相关资源
最近更新 更多