Python 2には、Python3.0execfile
で削除された組み込み関数がありました。この質問では、Python 3.0の代替案について説明しますが、Python3.0以降にかなりの変更が加えられています。
execfile
Python3.2および将来のPython3.xバージョンの最良の代替手段は何ですか?
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, {})
、新しい一時ディクショナリをグローバルディクショナリとローカルディクショナリの両方として使用して、新しい一時スコープでファイルを効果的に実行できます。
execfile(filename)
で置き換えることができます
exec(open(filename).read())
Pythonのすべてのバージョンで動作します
新しいバージョンのPythonは、そのファイルを閉じなかったことを警告するので、その警告を取り除きたい場合は、これを行うことができます。
with open(filename) as infile:
exec(infile.read())
しかし、実際には、ファイルを閉じることに関心がある場合は、そもそも使用しないように十分に注意する必要がありますexec
。
Python3.xでは、これはファイルを直接実行するのに最も近いものであり、実行中のファイルと一致しますpython /path/to/somefile.py
。
ノート:
__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")
標準のrunpy.run_pathが代替手段です。