gpt4 book ai didi

python - 隐式相对导入如何在 Python 中工作?

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:18 28 4
gpt4 key购买 nike

假设我有以下文件,

pkg/
pkg/__init__.py
pkg/main.py # import string
pkg/string.py # print("Package's string module imported")

现在,如果我运行 main.py,它会显示 "Package's string module imported"

这是有道理的,它按照本 link 中的声明工作:

"it will first look in the package's directory"

假设我稍微修改了文件结构(添加了一个核心目录):

pkg/
pkg/__init__.py
plg/core/__init__.py
pkg/core/main.py # import string
pkg/string.py # print("Package's string module imported")

现在,如果我运行 python core/main.py,它会加载内置的 string 模块。

同样在第二种情况下,如果它必须遵守声明“它将首先在包的目录中查找”,它不应该加载本地 string.py 因为 pkg 是“包目录”?

我对术语“包目录”的理解是特别是根文件夹集合__init__.py 文件夹的根文件夹 。所以在这种情况下,pkg 是“包目录”。它适用于 main.py 以及 core/main.py 等子目录中的文件,因为它是此“包”的一部分。

这在技术上是否正确?

PS:代码段中#后的内容是文件的实际内容(前导空格)。

最佳答案

包是带有 __init__.py 的目录文件,是的,在模块搜索路径中找到时作为模块加载。所以pkg 如果父目录在模块搜索路径上,则只是一个您可以导入并视为一个包的包。

但是通过运行 pkg/core/main.py文件作为脚本,Python 添加了 pkg/core模块搜索路径的目录,而不是 pkg 的父目录.你有一个__init__.py现在在您的模块搜索路径上的文件,但这不是定义包的内容。你只有一个 __main__模块,与其他任何东西都没有包关系,你不能依赖隐式相对导入。

你有三个选择:

  1. 不要将包内的文件作为脚本运行。将脚本文件放在包的外部,并根据需要导入您的包。您可以将它放在 pkg旁边目录,或确保 pkg目录首先安装到模块搜索路径上已有的目录中,或者让您的脚本计算正确的路径以添加到 sys.path .

  2. 使用 -m command line switch像运行脚本一样运行模块。如果你使用 python -m pkg.core Python 将寻找 __main__.py文件并将其作为脚本运行。 -m switch 会将当前工作目录添加到您的模块搜索路径中,因此您可以在正确的工作目录中使用该命令,一切都会正常进行。或者将您的包安装在模块搜索路径中已有的目录中。

  3. 让您的脚本将正确的目录添加到模块搜索路径(基于 os.path.absolute(__file__) 以获得当前文件的路径)。考虑到您的脚本总是名为 __main__ , 并导入 pkg.core.main将添加第二个独立的模块对象;你会有两个独立的命名空间。

我还强烈建议不要使用隐式相对导入。您可以通过添加同名的嵌套包或模块来轻松屏蔽顶级模块和包。 pkg/time.py会在标准库之前找到 time模块,如果你尝试使用 import timepkg里面包裹。相反,使用 显式 相关模块引用的 Python 3 模型;添加 from __future__ import absolute_import到所有文件,然后使用 from . import <name>明确说明您的模块是从哪里导入的。

关于python - 隐式相对导入如何在 Python 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48304317/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com