2

コードをモジュールとしてロードし、同じモジュールをリロードしようとしていますが、Python でプログラムによって異なるコードを使用しています。

import imp

a = """
def test():
    print "Hello from a"
"""

b = """
def test():
    print "Hello from b"
"""


for code in [a, b]:
    with open('user.py', 'wb') as f:
        f.write(code)
    mod = imp.load_source('user', 'user.py')
    getattr(mod, "test")()

期待される出力:

Hello from a
Hello from b

実際の出力:

Hello from a
Hello from a

明らかに、それがどのように機能するかについての私の理解は正しくありませんが、自分の間違いを理解できないようです。

動作させる唯一の方法は、ファイルにコードを書き込む前に、生成された .pyc ファイルを削除することでしたf。より良い方法はありますか?

4

3 に答える 3

3

文字列またはファイルからコードを動的にロードする場合は、.の代わりにexec/を使用することをお勧めします。静的またはめったに変更されないファイルを対象としています。execfileimportimport

を引き続き使用する場合はimp.load_source、次の注意事項に注意してください。

適切に一致するバイト コンパイル ファイル (接尾辞 .pyc または .pyo を持つ) が存在する場合、指定されたソース ファイルを解析する代わりに、それが使用されることに注意してください。

「適切に一致する」とは、コンパイルされたファイルのバージョンがインタープリターと一致し、タイムスタンプが一致することを意味します。Tim が指摘しているように、ファイルを立て続けに 2 回書き込むと、タイムスタンプが変更されず、.pyc が有効であると見なされる可能性があります。

于 2012-09-19T06:39:22.157 に答える
2

おそらく、.pycファイルのタイムスタンプ (1 秒単位の精度) が、新しく書き込まれた.pyファイルのタイムスタンプよりも古くないためではありません。したがって、最初に削除しない限りimp、「現在の」.pycファイルが使用されます。

または、モジュールをリロードする前に 2 秒間待機することもできます。

于 2012-09-19T06:38:00.467 に答える
0

Python ファイル、モジュール、またはパッケージを実行またはインポートするたびに、インタープリターは、py ファイルのバージョンと一致する pyc ファイルが存在するかどうかを確認します。そうでない場合は pyc ファイルを使用し、そうでない場合は py ファイルをコンパイルして古い pyc ファイルを上書きします。pyc が py ファイルのバージョンと一致する場合、ファイルの日付に基づいています。ファイルを保存していないため (f)、Python はその間に何かが変更されたことを認識しません。したがって、アプローチを機能させたい場合は、各ループの後にファイルを保存する必要があります。

于 2012-09-19T07:02:17.847 に答える