gpt4 book ai didi

python - 这个 __import__ 功能是否正确?

转载 作者:太空宇宙 更新时间:2023-11-03 11:57:29 24 4
gpt4 key购买 nike

我有一个名为 jiva_tasks 的包,我试图通过 celery 导入它(使用 celeryconfig 的 CELERY_IMPORTS 属性。celery 使用的导入语句是这样的:

__import__(module, [], [], [''])

奇怪的是,当使用这种语法时,模块被导入两次,一次作为jiva_tasks,另一次作为jiva_tasks。(与最后一个句点)。现在,很有可能 celery 应该 传递全局变量而不是空列表,但这对我来说似乎很糟糕。这似乎很奇怪,即使给出了错误的参数,__import__ 也会导入一些不是有效的 python 模块名称的东西。

我知道解决这个问题的方法是传入 globals,但我想了解为什么会得到这个结果。这是一个错误,还是我不明白 __import__ 的工作原理?

更新:如果我使用 importlib,它似乎也能正常工作。

更新 2:这是执行 __import__ 行之前的 sys.meta_pathsys.import_path :

>>> sys.meta_path
[]
>>> sys.path_hooks
[<type 'zipimport.zipimporter'>]

在我看来没有任何异常。但是,我现在才意识到我正在导入的包是使用 setuptools 的 develop 命令安装的。这有什么不同吗?

最佳答案

创建一个空文件“foo.py”,然后创建一个“bar.py”,上面写着:

__import__('foo', [], [], [''])
import sys
print sorted(sys.modules)

打印出一个只包含 foo 一次的列表,而不是 foo. 或任何其他带有尾随点的东西——所以这不仅仅是 celery 使用 __import__ 导致这里出现问题。你能弄清楚 celery 在添加第二个模块时采取了什么额外的步骤吗? (或者在 __import__() 调用之前和之后的 print sorted(sys.modules) 是否表明两个模块都出现在那个时刻——在这种情况下我们需要查看在导入时定义了哪些导入 Hook ?)

关于python - 这个 __import__ 功能是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3017219/

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