2016-06-22 6 views
0

デバッグ中に使用しているオブジェクトに関する情報を表示できるようにするために、スクリプトを作成して-i引数を付けて実行しています。現在のパッケージをインポート中

スクリプトを終了して再実行するのを避けるために、スクリプトを変更して保存して[スクリプト名]をインポートし、[スクリプト名]でメインメソッドを呼び出すことができるとわかりました。メインメソッド]()。

今、私はありません(便宜上)単一文字方式書きたい:

def x(): 
    import [this script] 
    [this script].[main-method]() 

だけでなく、スクリプトのファイル名を変更し、変更することなく、簡単リロード機能を保持することができるようにしますコード。

importlib(下記参照)を使用して無駄にしてみました。

def y(): 
    import importlib 
    this = importlib.import_module("".join(sys.argv[0].split(".py"))) # sys.argv[0] gives [module-name].py and the rest of the code inside the parentheses removes the ".py" 
    this.[main-method]() 

答えて

1

import、それの化身のいずれにおいても、一度だけ、スクリプトをリロードします。あなたはreload機能を探しています:

from importlib import reload 
import sys 

def main(): 
    pass 

def x(): 
    reload(sys.modules[__name__]) 
    main() 

このコードは、あなたが(おそらく__main__)に現在あるモジュールをリロードし、そこからメソッドを再実行します。あなたはインタプリタからスクリプトをリロードしたい場合は、代わりに次の手順を実行します。スクリプトは奇妙な場所にある場合

>>> from importlib import reload 
>>> def x(): 
...  reload(mymodule) 
...  mymodule.main() 
... 
>>> import mymodule 
>>> mymodule.main() 
>>> # Do some stuff with mymodule 
>>> x() 

あなたはmymodule = importlib.import_module("".join(sys.argv[0].split(".py")))import mymoduleを交換する必要があります。

出典:私はそれをやった

+0

これは、私に "ImportError:内部モジュール__main__を再初期化できません"という結果をもたらします。メインモジュールをリロードすることは例外ですか? – PistoletPierre

+0

はい。コマンドラインからこれを試してはいけません。 \ _ \ _ main \ _ \ _はあなたが入力したすべてのものを含む "モジュール"です。あなたはそれをリロードすることはできません。 –

+0

面白いことに、すべてのアンダースコアの前にバックスラッシュを使用して、特別な意味を削除することができます。これを試してください:\\ _ \\ _メイン\\ _ \\ _ –

0

def x(): # make what I'm doing now at this very moment easier 
    main() 
    print("It works!") 

def y(): # calls x() after loading most recent version 
    import importlib 
    from imp import reload 
    this = importlib.import_module("".join(sys.argv[0].split(".py"))) # sys.argv gives [module-name].py and the rest of the code inside the brackets removes the ".py" 
    this = reload(this) 
    this.x() 
+0

'this = importlib.import_module'は一度だけ行う必要があります。 'this 'をグローバルにしてから、' this = reload(this) 'を実行してリロードしてください。 'this.main()'も同様です。 –

+0

ありがとう@MadPhysicist – PistoletPierre

+0

FYI、 'imp'は何らかの理由で3.4以降で廃止されました。しかし、そのメソッドの多くは 'reload'を含む' importlib'に存在するので、3.4以降では 'importlib'をインポートして' import_module'と 'reload'の両方を得ることができます。 – ShadowRanger

関連する問題