2016-07-05 4 views
5

インポートされたモジュールがあり、そのモジュールのインポートされたインスタンス内で特定の変数値を変更して実行する必要があります。モジュールをインポートしてモジュール内の変数値を変更して実行する方法

ご注意ください私は、従来の理由により、インポートされるモジュールを一度変更することはできません。ここで

は私がしようとしているものです:

var1 = 1 
var2 = 2 

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

のように見えますが、今私は、b.pyに発信者をこれをインポートしています、私は、a.pyをインポートしたいモジュールを言いますスクリプト。私はそれをインポートしようとしている変数var1の値を変更し、runpyを使用して主なプログラムとしてそれを次のように実行します。

import runpy 
import a 

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

しかし、これだけではなく、予想通り4として3として結果を出力します。

これを達成するための他の方法は、a.pyで何も変更せずに(runpyを使用する以外は)ですか?任意のサードパーティのモジュールを開く限り、モジュールをインポートする必要はありません。

私はここでの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.重要な点は、モジュールがインポート/実行時に変更される可能性のある変数の変更に対して免除されるクラスのような別のdictを持つことです。この辞書は、値を変更したい変数を保持しています。

#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

関連する問題