web-dev-qa-db-ja.com

python refresh / reload

これは非常に基本的な質問ですが、オンラインで検索して答えを見つけることができませんでした。

ArcGISを制御するためにpythonを使用しています。また、事前に記述されたコードを呼び出す簡単なpythonスクリプトがあります。

ただし、事前に作成されたコードに変更を加えても、変更が生じたようには見えません。このモジュールをインポートし、更新しようとしましたが、何も起こりません。

呼び出すファイルを別の場所に移動しましたが、スクリプトは引き続き正常に機能します。昨日やったことの1つは、すべてのpythonファイルがsys.append( 'path')を使用して)sysパスにあるフォルダーを追加し、それが違いを生むかどうか疑問に思いました。

事前に感謝します、そして、ずさんな用語でごめんなさい。

27
womble

「リフレッシュ」の意味は明確ではありませんが、Pythonの通常の動作では、ソフトウェアを再起動してPythonモジュールを新しく見て再読み込みする必要があります。

再起動後も変更が処理されない場合は、次の2つのエラーのいずれかが原因です。

  1. Pyc-fileのタイムスタンプが間違っており、将来のある時点で。
  2. 実際に間違ったファイルを編集しています。

Reload()コマンドでソフトウェアを再起動しなくても、reloadでファイルを再読み込みできます。モジュール内の任意のものを指す変数は、リロード後に再インポートする必要があることに注意してください。このようなもの:

import themodule
from themodule import AClass

reload(themodule)
from themodule import AClass
32
Lennart Regebro

これを行う1つの方法は、 reload を呼び出すことです。

例:_foo.py_の内容は次のとおりです。

_def bar():
    return 1
_

対話型セッションでは、次のことができます。

_>>> import foo
>>> foo.bar()
1
_

次に、別のウィンドウで、_foo.py_を次のように変更できます。

_def bar():
    return "Hello"
_

対話型セッションに戻り、foo.bar()を呼び出すと、実行するまで1が返されます。

_>>> reload(foo)
<module 'foo' from 'foo.py'>
>>> foo.bar()
'Hello'
_

reloadの呼び出しは、ディスク上のファイルが変更された場合でもモジュールが最新であることを保証するone方法です。必ずしも最も効率的ではありません(ファイルの最終変更時刻を確認するか、reloadの前に pyinotify のようなものを使用した方が良いかもしれませんが、確かに迅速です実装する。

Pythonが毎回ソースモジュールから読み込まれない理由の1つは、モジュールのロードが(比較的)高価になることです。300kbモジュールがあり、単一の定数を使用している場合ファイルから?Pythonモジュールを一度ロードし、reloadになるまでメモリに保持します。

19
Mark Rushakoff

モジュール内からすべてのオブジェクトをインポートするときに、web2pyが現在のコードを使用していることを確認するために、次を使用しました。

import buttons
import table
reload(buttons)
reload(table)
from buttons import *
from table import *
3
Aram Kocharyan

IPythonシェルで実行している場合、いくつかの魔法のコマンドが存在します。

IPythonドキュメントは autoreload extension と呼ばれるこの機能をカバーしています。

もともと、私はこのソリューションを このテーマに関するジョナサンマーチのブログ投稿 から見つけました(そのリンクのポイント3を参照)。

基本的にあなたがしなければならないことは以下だけであり、あなたが行った変更は保存後に自動的に反映されます:

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: Import MODULE

In [4]: my_class = Module.class()
        my_class.printham()
Out[4]: ham

In [5]: #make changes to printham and save
In [6]: my_class.printham() 
Out[6]: hamlet
3
Thej Kiran

私はそれがあなたが何を意味するのか本当によく分からないので、私を訂正することをheしないでください。あなたはあなたのプログラムでモジュールをインポートしています-mymodule.pyと呼びましょう-しかし、あなたがその内容を変更しても、違いは見えませんか?

Pythonは、使用されるたびにmymodule.pyの変更を探しません。最初にロードし、バイトコードにコンパイルして、内部に保持します。通常、コンパイルされたバイトコード(mymodule.pyc)も保存します。次回プログラムを起動するときに、mymodule.pyがmymodule.pycよりも新しいかどうかを確認し、必要に応じて再コンパイルします。

必要な場合は、モジュールを明示的にリロードできます。

_import mymodule

[... some code ...]

if userAskedForRefresh:
    reload(mymodule)
_

もちろん、それはそれよりも複雑であり、たとえば変数がmymoduleで定義されたクラスに依存する場合など、他のモジュールに関してプログラムで何をするかに応じて副作用が生じる可能性があります。

または、execfile関数(またはexec()eval()compile())を使用できます。

1
RedGlyph

ArcGIS 10.2のジオプロセシングスクリプトの作成とまったく同じ問題がありました。 pythonツールボックススクリプト、ツールスクリプト、そして一般的なスクリプトがありました。実行するコードのバージョンを制御するツールに、Dev/Test/Prodのパラメーターがあります。Dev devフォルダーでコードを実行し、testフォルダーからテストし、prodフォルダーからprodを実行します。ツールをArcCatalogから実行すると、共通のdevスクリプトへの変更は実行されません。常にprodフォルダーから実行されます。

ツールスクリプトにreload(myCommonModule)を追加すると、この問題は解決しました。

0
Allan Benvin

ケースは、Pythonのバージョンによって異なります。以下にpython 3.4バージョン以上の例を示します。

hello import hello_world
#Calls hello_world function
hello_world()
HI !!
#Now changes are done and reload option is needed
import importlib
importlib.reload(hello)
hello_world()
How are you?

以前のpythonバージョン2.xの場合、上記のように組み込みリロード機能を使用します。自動リロード機能を提供するipython3を使用することをお勧めします。

0
Dhiraj Sharma