这个__import__功能是否正确?

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

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

奇怪的是,当使用此语法时,模块将导入两次,一次作为jiva_tasks,另一次作为jiva_tasks. (最后一段时间).现在,很有可能芹菜应该通过全局而不是空列表来传递,但这对我来说似乎有些不妥.奇怪的是,即使给出了错误的参数,__ import__也会导入一些不是有效python模块名称的东西.

我知道解决这个问题的方法是传递全局变量,但我想知道为什么我得到这个结果.这是一个错误,还是我不明白__import__是如何工作的?

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

更新2:这是执行__import__行之前的sys.meta_path和sys.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.或者带有尾随点的任何其他东西 – 所以这不仅仅是因为芹菜正在使用__import__导致问题.你能弄清楚芹菜正在采取哪些额外的步骤来增加第二个模块吗? (或者在__import __()调用之前和之后打印排序(sys.modules)表明这两个模块都出现在那一刻 – 在这种情况下我们需要查看导入时定义的导入挂钩?)

上一篇:global,globals(),locals(),nonlocal


下一篇:Python exec中的范围