【问题标题】:Shouldn't the imports be absolute by default in python27?默认情况下,python27 中的导入不应该是绝对的吗?
【发布时间】:2012-07-30 17:36:43
【问题描述】:

想象一下目录结构:

/ 一种/ __init__.py b.py py py

文件/a/b.py 看起来像:

进口c 应该_be_absolute = c

所有其他文件(包括__init__)都是空的。

运行测试脚本时(使用 python 2.7):

import a.b
print a.b.should_be_absolute

PYTHONPATH=/ 来自一个空目录(因此没有任何内容从当前目录添加到 PYTHONPATH)我得到

<module 'a.c' from '/a/c.py'>

根据PEP 328 和声明import &lt;&gt; is always absolute 我希望:

<module 'c' from '/c.py'>

当我删除 /a/c.py 文件时,输出与预期一样。

我错过了什么?如果这是正确的行为 - 如何从b(而不是a.c)导入c 模块?

更新:

根据python dev mailing list,这似乎是文档中的一个错误。默认情况下,python27 中的导入不是绝对的。

【问题讨论】:

  • 你完整的pythonpath是什么?只有 / 吗?您可能应该使用根包名
  • FWIW,这在 Python 3 中可以正常工作。
  • @jdi - 是的,根是 PYTHONPATH 中唯一的东西(编辑了原始帖子以使其更加明确)

标签: python import


【解决方案1】:

您需要在 Python 2.7 上添加 from __future__ import absolute_import 或使用 importlib.import_module('c')

这是 Python 3 的默认设置。

Python 中有一个错误:__future__.py and its documentation claim absolute imports became mandatory in 2.7, but they didn't

【讨论】:

  • 你是对的!进一步挖掘后,我找到了python-dev mailing list 的链接,确认绝对导入功能在 python27 中默认未启用。
【解决方案2】:

如果您只是将/ 添加到您的PYTHONPATH 中,那么搜索顺序可能仍会在当前目录中查找c。如果您将所有内容都放在根包下并绝对引用它会更好:

/myPackage
    a/
        __init__.py
        b.py
        c.py
    __init__.py
    c.py

还有一个 PYTHONPATH,例如:export PYTHONPATH=/:$PYTHONPATH

所以在你的a.c 中你会做这些:

from myPackage import c
from myPackage.c import Foo
import myPackage.c

这样,它总是相对于你的包。

【讨论】:

  • 谢谢,但问题更多的是这是一种正确的行为,而不是如何重新组织代码以使其工作。我正在解决的实际问题是'c'是python内置模块的名称,而我正在工作的包中的代码正在隐藏它(根据python文档不应该)
【解决方案3】:

“绝对”并不是你认为的那个;相反,这意味着发生了“通常”的包解析过程:首先,它在包的目录中查找,然后在 sys.path 的所有元素中查找;其中包括 PYTHONPATH 中的元素。

如果您真的想要,您可以使用 imp 模块之类的工具,但我建议您不要这样做。因为一般情况下,您不必创建与标准 Python 发行版中同名的模块。

【讨论】:

  • 感谢@Ivo,但PEP 328#rationale-for-absolute-imports 声明绝对导入将始终是可从sys.path 访问的模块或包。首先在包目录中查找没有任何内容。您能否指出一些记录您所描述行为的资源?
  • docs.python.org/reference/simple_stmts.html#import 在实现过程中非常清楚:“如果要导入的模块应该包含在包中,那么第二个参数传递给 find_module(), path 在父包上,用作路径的来源。”
  • “首先,它在包的目录中查找”。不,这是相对导入。
猜你喜欢
  • 2011-11-12
  • 2019-05-21
  • 1970-01-01
  • 2013-06-11
  • 2021-05-14
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
相关资源
最近更新 更多