2010-06-10 94 views
4

我有一个名为jiva_tasks包,我想通过芹菜导入(使用celeryconfig的CELERY_IMPORTS的属性,芹菜使用import语句是这样的:这是__import__功能是否正确? 。

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

奇怪的是,当这个语法是使用时,模块获取导入两次,一次为jiva_tasks,另一次为jiva_tasks.(最后一段时间)。现在,芹菜应该应该通过全局而不是空列表,但似乎打破了我。看起来很奇怪,即使给出了错误的论点,__import__会导入一些这不是一个有效的python模块名称。

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

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

更新2:这里的sys.meta_pathsys.import_path__import__线被执行权之前:

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

它不会出现,我认为有任何不寻常的。但是,我刚才意识到我正在导入的软件包是使用setuptools的develop命令安装的。这有什么区别吗?

回答

1

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

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

打印出的清单只包括foo一次,而不是foo.或其他任何与尾随点 - 所以这不是简单的事实,芹菜使用__import__这是造成问题在这里。你能想出芹菜正在增加的第二个模块吗? (或者print sorted(sys.modules)__import__()调用之前和之后提示这两个模块在那一刻出现 - 在这种情况下,我们需要查看导入时刻定义了哪些导入钩子)

+0

我没想到关于进口钩子。虽然''__import__'调用时,'foo.' * *好像正在sys.modules中注册。 – 2010-06-15 14:24:24

+0

如果'__import __()'增加了'foo.',那么让我们来看看导入钩子!向你的问题添加“sys.metapath”和“sys.path_hooks”打印输出,如果你发现任何问题,请尝试与我们分享他们的代码。 – 2010-06-16 03:44:33

+0

已更新。它看起来并不像我有任何不寻常的导入钩子。 – 2010-06-16 13:47:12