4

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

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

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

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

更新:如果我使用它似乎也可以正常工作importlib

更新 2:这是执行该行之前的sys.meta_pathand :sys.import_path__import__

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

在我看来,没有什么不寻常的地方。但是,我刚刚意识到我正在导入的包是使用 setuptools 的开发命令安装的。这有什么区别吗?

4

1 回答 1

1

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

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

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

于 2010-06-15T04:40:35.350 回答