2016-07-05 169 views
5

我有一個模塊,我需要導入並更改該模塊的導入實例中的特定變量值,然後執行它。如何導入模塊並更改模塊中的變量值並執行它

請注意,由於遺留原因,我無法對正在導入的模塊進行單個更改。

這裏就是我想要做:

說模塊I要導入,a.py,看起來像

var1 = 1 
var2 = 2 

if __name__ == '__main__': 
    print var1+var2 

現在我在b.py導入此,主叫腳本。我試圖導入它,更改變量var1的值,並使用runpy作爲主程序運行,如下所示。

import runpy 
import a 

a.var1 = 2 
result = runpy._run_module_as_main(a.__name__) 

但這打印結果爲3,不作爲4預期。

任何其他方式來實現這一點(除了使用runpy)而不改變a.py中的任何東西?只要我不需要對導入的模塊進行更改,就可以打開任何第三方模塊。

我使用Python 2.6

+1

如果你真的*想要這樣做,你會需要'ast'模塊,我相信。 –

+0

@WayneWerner請讓我知道 – MohitC

+0

你*真*不應該這樣做,只是使用類而不是。 –

回答

3

這裏是一個具體的實現什麼,我在評論中提出:

#File temp.py 
var1 = 1 
var2 = 2 

if __name__ == '__main__': 
    print var1+var2 

我通過另一個文件run.py.調用它關鍵是要有另一個類似的類,它可以避免模塊在導入/運行時可能發生變化的任何變化。這個字典保存你想要改變其值的變量。

#File: run.py 
class UpdatedDict(dict): 
    def __setitem__(self, key, value): 
     if key != "var1": 
      super(UpdatedDict, self).__setitem__(key, value) 

u = UpdatedDict({"var1": 10, '__name__': '__main__'}) 
exec open("temp.py").read() in u #u here is the globals() for the module. 

輸出

~/Temp$ python run.py 
12 #Yay! 

注意:這是一個快速和骯髒的實施,只是爲了告訴你,你可以做到這一點。我建議通過runpy,並使此代碼看起來更健壯。現在,它是一個正確的定義hackish

+0

這很棒!非常感謝。 :)您可能需要通過所有舊版腳本並對其進行必要的更改,而不會中斷其他體系結構,從而爲我節省了2天時間。 – MohitC

+0

雖然這可行,但由於這樣做而節省的工作很可能被人們不得不處理的額外工作所抵消。它創建了非常緊密的非本地耦合,通過讀取它修改的代碼無法檢測到,使得更改系統的任何部分變得更加困難。當他們的任務陳述被完全忽略時,人們會非常困惑。 – user2357112

+0

@ user2357112完全不同意!我希望OP能夠實現你剛剛所說的話。 – SuperSaiyan