2010-06-10 86 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