gpt4 book ai didi

python - 相对进口结构

转载 作者:行者123 更新时间:2023-12-01 02:40:40 25 4
gpt4 key购买 nike

我的程序的结构如下:

scripts/
__init__.py
mod1.py
mod2.py
sub1/
__init__.py
mod3.py
sub2/
__init__.py
mod4.py

所有程序都以 mod1.py 启动,它根据提供的系统参数选择要运行的后续脚本 (mod3/mod4.py)。因此导入时的顶级目录是scripts/

假设我运行我的程序,>mod1.py 3 执行sub1.mod3。在 mod3 中,我需要在 mod2 中定义一个函数(该模块包含 mod3/mod4 重用的代码块)。

当我尝试 from .. import mod2 时,我收到 ValueError ,表明我尝试在顶级目录之外进行相对导入。我指的是 docs在语法上,如果我们将它们与我的情况进行比较,mod3.py 将是当前模块(在 mod1.py 之后)调用它。

我尝试进行相对导入的方式有什么问题?

mod1.py:

import sys

def imp(module):
m = __import__(module) # equivalent to import module as m
m.start()

if __name__ == '__main__':
mods = {'3': 'sub1.mod3',
'4': 'sub2.mod4'}

imp(mods[sys.argv[1]])

mod3.py

from .. import mod2  # fails
import mod2 # works; guessing since import considers mod1 location top-level
.
.
.
def start():
# do stuff

最佳答案

你说:

All programs are started with mod1.py which chooses which subsequent script (mod3/mod4.py) to run based off supplied system arguments. So the top level directory at import is scripts/.

From the docs (6.4.2 包内引用):

Note that relative imports are based on the name of the current module. Since the name of the main module is always "__main__", modules intended for use as the main module of a Python application must always use absolute imports.

因此您必须在文件中使用绝对导入。

所以你的代码应该是这样的

from scripts.mod2 import X

from scripts import mod2

此外,我不确定您为什么要这样做。将两个模块保存在单独的包中,并使用 if 条件加载它们,同时将文件全部保存在同一目录中(没有 __init__.py)会更简单:

if sys.argv[1] == '3':
import mod3
elif sys.argv[2] == '4':
import mod4

如果您必须将它们保存在单独的文件夹中,请使用以下结构:

scripts/
mod1.py
pkg/
__init__.py
mod2.py
sub1/
__init__.py
mod3.py
sub2/
__init__.py
mod4.py

使用这种结构,您的相对导入应该可以工作。导入将是:

if sys.argv[1] == '3':
from pkg.sub1 import mod3
elif sys.argv[2] == '4':
from pkg.sub2 import mod4

值得注意的是,无论您导入库或包的哪一部分,整个包都会被导入 - 只是并非全部在范围内可用。

关于python - 相对进口结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45757863/

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