gpt4 book ai didi

python - Python 3 中的动态导入 + 相对导入

转载 作者:太空宇宙 更新时间:2023-11-04 06:29:00 26 4
gpt4 key购买 nike

我有一个 Python 3 项目,我在其中使用 imp.load_module 从磁盘动态导入模块。但是,当相对导入发生在动态导入的模块中时,我遇到了相对导入失败的问题。

根据我的阅读,我得出的结论是只有 __file____path____package____name__ 在确定导入路径时由默认导入程序使用。然而,我已经在下面的代码中验证了这些,并且在动态导入时仍然失败。 (它在使用更新的 sys.path 导入解释器时有效)

# File structure:
# [root]
# ├─ __init__.py
# ├─ board.py
# └─ test.py

# Contents of 'board.py':
import os, sys
import root # Already imported... just need a reference

ROOT_DIR = os.path.dirname(root.__file__)
assert root is sys.modules['root']
assert root.__package__ is None
assert root.__name__ == 'root'
assert root.__file__ == os.path.join(ROOT_DIR, '__init__.py')
assert not hasattr(root, '__path__')

xx = object()
assert xx is sys.modules['root.board'].xx
assert __package__ is None
assert __name__ == 'root.board'
assert __file__ == os.path.join(ROOT_DIR, 'board.py')
assert not hasattr(sys.modules['root.board'], '__path__')

assert os.path.isfile(os.path.join(ROOT_DIR, 'test.py'))
from . import test # ImportError('cannot import name test',)

但如果我破解 sys.path 并在导入失败之前重新导入当前包,它会起作用:

oldroot = root
del sys.modules['root']
sys.path.append(os.path.dirname(ROOT_DIR))
import root
from . import test # No error here

此外,以上提到的四个黄金属性在新旧套餐中都是一样的:

assert oldroot.__package__ == root.__package__
assert oldroot.__name__ == root.__name__
assert oldroot.__file__ == root.__file__
assert not hasattr(root, '__path__')

这意味着 __package____name____file____path__ 不能是完整的故事。 Python 是否还有其他属性用于定位导入?我忽略了什么会导致导入失败?

最佳答案

root.__path__ 值的缺失是可疑的(这意味着 Python 不认为 root 是一个包)。

两个 load_module() 调用都是使用类型值 1(一个模块)而不是第一个类型为 的事实5(一个包)也很可疑。

您是否使用 imp.find_module() 计算出对 imp.load_module() 调用的正确输入?

对于一个包,imp.load_module() 的输入应该是这样的:

# demo is a package in the current directory for this example
>>> info = imp.find_module('demo')
>>> info
(None, 'demo', ('', '', 5))
>>> demo = imp.load_module('demo', *info)
>>> demo.__path__
['demo']

关于python - Python 3 中的动态导入 + 相对导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5078590/

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