这个__import__功能是否正确?

时间:2010-06-10 18:16:03

标签: python import celery globals

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

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

奇怪的是,当使用此语法时,模块将导入两次,一次导入为jiva_tasks,另一次导入为jiva_tasks.(末尾为句点)。现在,很有可能celery 应该传递全局而不是空列表,但这似乎对我不利。看起来很奇怪,即使给出了错误的参数,__import__也会导入一些不是有效的python模块名称。

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

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

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

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

在我看来并不存在任何与众不同的东西。但是,我刚刚意识到我导入的软件包是使用setuptools的develop命令安装的。这有什么不同吗?

1 个答案:

答案 0 :(得分:1)

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

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

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