63

Python 2には、Python3.0execfileで削除された組み込み関数がありました。この質問では、Python 3.0の代替案について説明しますが、Python3.0以降にかなりの変更が加えられています。

execfilePython3.2および将来のPython3.xバージョンの最良の代替手段は何ですか?

4

4 に答える 4

74

2to3スクリプトが置き換えられます

execfile(filename, globals, locals)

exec(compile(open(filename, "rb").read(), filename, 'exec'), globals, locals)

これは公式の推奨事項のようです。ブロックを使用withして、ファイルがすぐに再び閉じられるようにすることができます。

with open(filename, "rb") as source_file:
    code = compile(source_file.read(), filename, "exec")
exec(code, globals, locals)

globalsおよび引数を省略してlocals、現在のスコープでファイルを実行するかexec(code, {})、新しい一時ディクショナリをグローバルディクショナリとローカルディクショナリの両方として使用して、新しい一時スコープでファイルを効果的に実行できます。

于 2011-06-15T12:07:15.897 に答える
65
execfile(filename)

で置き換えることができます

exec(open(filename).read())

Pythonのすべてのバージョンで動作します

新しいバージョンのPythonは、そのファイルを閉じなかったことを警告するので、その警告を取り除きたい場合は、これを行うことができます。

with open(filename) as infile:
    exec(infile.read())

しかし、実際には、ファイルを閉じることに関心がある場合は、そもそも使用しないように十分に注意する必要がありますexec

于 2011-06-15T12:15:11.913 に答える
9

Python3.xでは、これはファイルを直接実行するのに最も近いものであり、実行中のファイルと一致しますpython /path/to/somefile.py

ノート:

  • エンコーディングの問題を回避するためにバイナリ読み取りを使用します
  • ファイルを閉じるためにGarenteed(Python3.xはこれについて警告します)
  • を定義します__main__。一部のスクリプトはこれに依存して、モジュールとしてロードされているかどうかを確認します。if __name__ == "__main__"
  • 設定__file__は例外メッセージに適しています。一部のスクリプトは__file__、それらに関連する他のファイルのパスを取得するために使用します。
def exec_full(filepath):
    global_namespace = {
        "__file__": filepath,
        "__name__": "__main__",
    }
    with open(filepath, 'rb') as file:
        exec(compile(file.read(), filepath, 'exec'), global_namespace)

# Execute the file.
exec_full("/path/to/somefile.py")
于 2012-12-01T06:41:35.470 に答える
3

標準のrunpy.run_pathが代替手段です。

于 2015-10-18T20:54:45.513 に答える