【问题标题】:Why does this Python3 module appear to perform a relative import of itself?为什么这个 Python3 模块似乎执行了自身的相对导入?
【发布时间】:2014-10-01 13:48:16
【问题描述】:

如果我创建一个名为“json.py”的模块,其内容如下:

#! python
import json as _json
JSONDecoder = _json.JSONDecoder

..'import json as _json'语句不应该执行绝对导入,因此提供python标准库JSON模块吗?

..相反,如果我执行或导入此模块,我会得到:

$蟒蛇--版本 Python 3.4.0 $ python relative_import/json.py 回溯(最近一次通话最后): 文件“relative_import/json.py”,第 3 行,在 将 json 导入为 _json 文件“/home/silver/Projects/relative_import/json.py”,第 6 行,在 JSONDecoder = _json.JSONDecoder AttributeError:“模块”对象没有属性“JSONDecoder” $

..这表明“json”正在导入自身(相对导入)。 ..我想我错过了一些东西——python的导入系统对我来说总是自然而直观的,但在这种情况下我迷路了。

编辑:我使用的是 python 3.4

编辑:对于任何感兴趣的人,这就是发生的事情: 我有一个包,其中包含一个名为“json”的模块,它取代了系统“json”。这很好(IMO),但是,我还启动了一个脚本,它位于同一个包文件夹中(暂时),但并不意味着最终成为同一个模块的一部分。因此,发生了以下情况:

  • 我运行我的脚本 packagename/foo.py
  • python 将 packagename 文件夹添加到 sys.path
  • foo.py 导入 packagename.json
  • packagename.json 导入 json(通常是系统 json)
  • sys.path 上的第一个条目是 packagename 文件夹,“json”是从那里导入的
  • 我的 json.py 在导入后继续加载,并遇到错误(因为它是在处理自己,而不是系统 json 模块)

解决方案:将脚本移动到我的包的“bin”文件夹,或者,如果我希望它成为包的一部分,请使用python -m packagename.foo

谢谢你,@Martijn Pieters。

【问题讨论】:

    标签: python python-3.x python-import


    【解决方案1】:

    正在进行绝对导入。

    主脚本所在的目录被添加到sys.path,因此找到的第一个json就是你的脚本。您正在运行 python relative_import/json.py,因此 Python 将 relative_import/ 添加到 sys.path

    请注意,主脚本名为__main__,因此import json 确实将脚本文件作为单独的新模块对象导入。您的代码实际上加载了两次。

    Interface options documentation

    如果脚本名称直接引用 Python 文件,则将包含该文件的目录添加到 sys.path 的开头,并将文件作为 __main__ 模块执行。

    【讨论】:

    • 嗯。我曾认为从当前包中获取模块的唯一方法是使用from . import y 或(如果包在全球范围内可用)from mymodule import y。谢谢,这是我需要的缺少的细节。
    • @BrianVisel:不过你这里没有包。顶级脚本是never 一个包。如果您想将包用作脚本,请使用 -m 开关。
    • @BrianVisel:只有很多痛苦。基本上,您不会将脚本命名为会掩盖库的名称。
    • @BrianVisel:您必须使用importlib module 的低级功能来绕过正常的sys.path 导入查找语义。
    • @BrianVisel:当然,但在这种情况下,您不应该尝试将包中的文件作为脚本运行。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多