我有一个名为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命令安装的。这有什么不同吗?
答案 0 :(得分:1)
创建一个空文件“foo.py”,然后创建一个“bar.py”,上面写着:
__import__('foo', [], [], [''])
import sys
print sorted(sys.modules)
打印出一个仅包含foo
一次的列表,而不是foo.
或带有尾随点的任何其他内容 - 所以这不仅仅是芹菜正在使用__import__
导致的事实问题在这里。你能弄清楚芹菜正在采取哪些额外的步骤来增加第二个模块吗? (或者在print sorted(sys.modules)
调用之前和之后__import__()
建议在那个时刻出现两个模块 - 在这种情况下我们需要查看导入时定义的导入挂钩?)