2016-06-27 3 views
2

.pyファイルを実行する方法はありますか?.pyファイルの内容がそのままそのセルにあるかのように処理されますか?IPythonの.pyファイルを実行しています

たとえば、test1という関数がipythonノートブックで定義されている関数test4を呼び出して定義されているファイルexample.pyがあるとします。私がexample.py%run examplye.py経由で実行した場合、test4test1には分かりません。これは回避できますか?

答えて

3

Python2で、execfile関数は、あなたが望むことをするでしょう。 Python 3では、ファイルの内容を読み込んでコンパイルし、正しい名前空間で実行されることを確認して、そのことをエミュレートする必要があります。

私は定義されたノートブックのセルで

f4("something") 

次のコードセルが正しくファイル内のコードを実行するために表示されます:

私は、次のコードを含むファイル testme.pyを持って

def f4(x): 
    return x+x 

with open("testme.py") as f: 
    code = compile(f.read(), "testme.py", 'exec') 
    exec(code, globals(), locals()) 

実際には"somethingsomething"をexpecテッド。

コメントに記載されているように、変更されたモジュールをデバッグする場合は、reload()(Python2)またはimportlib.reload()で再インポートできます。しかし、あなたのコードの結合はかなり厳しいものです。グローバルな名前空間で同じ関数を探しています。これはテストすることを非常に困難にし、依存性注入アプローチを検討する方が良いかもしれません。次のようにあなたの関数に見えるとします

def my_func(a, b): 
    ... 
    f4(something) 
    ... 
    return result 

これは、グローバル名前空間にf4機能を見つける必要があります。より良い結合ソリューションは、次のようになります。

def my_func(a, b, f): 
    ... 
    f(something) 
    ... 
    return result 

あなたは、その3番目の引数としてf4my_funcを呼び出す - あなたはそれを呼び出す関数を超える絶対的な支配であり、そしてあなたが望むならば、テスト中に他の機能を使用することができますコードをより慎重に測るために、呼び出し元のモジュールのグローバル名前空間に関数が存在する必要がなくなりました。あなたが好きな関数に渡すことができます。

+0

こんにちは、多くのありがとうございます!私は今これを試してみる。 ipythonノートブックであらかじめ書かれたコードを使用するなど、この問題について全く異なる方法がないという意味で、自分の質問が合理的なものかどうかを質問できますか? Thx、m – clog14

+1

これは進歩が完全に不合理な方法ではありませんが、コンテンツがユーザーによって決定される場合、多くの危険性があります。プログラムの中で古いコード行を実行したいのですか? – holdenweb

+0

こんにちは、もう一度ありがとうございます。それはうまくいった。だから私は自分のためだけにコードを使用します。私の問題では、後で別の問題のために別のノートブックで使いたいかもしれないノートブックにいくつかのコードを書いています。より具体的には、ノートブックに固有のデータYと、別のノートブックでデータZに使用したい機能のsolve_model_X(Y)を持っています。私はモジュールで作業することができると信じていますが、ここの場合のように、solve_model_Xが頻繁に編集されると便利ではないようです。これを行う最善の方法は何だと思いますか?Thx – clog14

関連する問題