web-dev-qa-db-ja.com

Python 3?

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

execfile Python 3.2、および future Python 3.xバージョン の最良の代替手段は何ですか?

49
Matt Joiner

2to3スクリプト(Python 3.2)のスクリプトも置き換えます)

execfile(filename, globals, locals)

によって

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

これは公式の推奨事項のようです。

58
Sven Marnach
execfile(filename)

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

exec(open(filename).read())

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

47
Lennart Regebro

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

ノート:

  • バイナリ読み取りを使用して、エンコードの問題を回避します
  • ファイルを閉じるように注意してください(Python3.xはこれについて警告します)
  • __main__を定義し、一部のスクリプトはこれに依存して、モジュールとしてロードしているかどうかをチェックします。 if __== "__main__"
  • __file__の設定は例外メッセージに対してより適切であり、一部のスクリプトは__file__を使用して、それらに関連する他のファイルのパスを取得します。
def exec_full(filepath):
    import os
    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")
7
ideasman42

標準 runpy.run_path は代替です。

2
eudoxos