2012-10-17 25 views
2

基本上/前注射變量,我想強制一個變量,讓他打電話jim成插件加載我作爲一個全球性的,之前的插件加載,例如:導入期間

load_plugin('blah', variables={'jim':1}) #For instance 

然後裏面blah.py

print jim #prints 1 

有沒有簡單的方法來做到這一點?沒有什麼大不了的,如果它不在標準庫中。

回答

0

您可以使用__import__函數。它可以讓你覆蓋全局變量。
例如:

__import__('blah', dict(jim=1, **globals())) 
+0

這似乎並不工作,但它確實看起來像它應該。我仍然得到'NameError:名稱'jim'未定義。' – jozxyqk

+1

標準['__import__]實現[...]僅使用其全局變量來確定導入語句的包上下文。 https://docs.python.org/2/library/functions.html#__import__ - 儘管被接受並且upvoted,這個答案顯然是錯誤的。 – jsbueno

1

沒有 - 沒有辦法做到這一點之前插件首先被導入 - 所以,如果你的變量被用在模塊主體本身,你運氣不好。

如果變量被用作模塊的函數或方法(而不是類機構)中的全局變量,你可以改變它在模塊導入簡單地做後:

import module 
module.jim = 5 

你可能知道。 (我知道這不是你要求的)。

所以,實現這一目標的唯一方法是解析模塊的源代碼,並在那裏更改變量分配,保存源代碼並導入它。好的,有很多方法可以模擬內存中源代碼的導入,但這種方法非常實用,我們不應該詳細說明。

如果您可以通過這種方式對模塊的源代碼進行控制,我的建議是使用配置文件,模塊將從中選擇變量名稱。

然後,您生成配置文件,執行導入(注意它尚未導入到sys.modules中)並完成。