2011-06-15 120 views

回答

49

2to3腳本(還有一個在Python 3.2)由

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

這似乎是官方推薦替代

execfile(filename, globals, locals) 

+1

爲什麼這比Lennart的版本更好? – 2011-06-15 23:07:50

+0

@Matt:優點是(一)錯誤信息將包括正確的文件名和(二)它似乎是官方的建議,所以也許有我們不知道的優勢。如果你省略'globals'和'locals'參數,它也可以在所有版本的Python中工作。 – 2011-06-16 00:21:11

+0

我知道這是官方的建議,但與此我得到這些:「ResourceWarning:未關閉的文件<_io.TextIOWrapper名稱='...」錯誤。它只是測試運行器,所以它並不重要,但仍然.. – VPeric 2011-11-03 11:20:37

34
execfile(filename) 

可以

exec(open(filename).read()) 

這在Python

的所有版本
+0

爲什麼這比Sven的版本更好? – 2011-06-15 23:07:58

+8

@Matt:這很簡單嗎? – 2011-06-16 03:07:10

+0

必須是由於我的代碼,但是當我使用這個,而不是execfile,我得到:「SyntaxError:不合格的exec不允許在函數'test_file'它包含嵌套函數與自由變量」(在Python 2.7中) – VPeric 2011-11-03 11:22:10

5

在Python3.x被替換,這是最近的事情,我可以拿出來直接執行文件時,匹配運行python /path/to/somefile.py

注:

  • 使用二進制閱讀,避免編碼問題
  • Garenteed關閉文件(Python3.x警告這個)
  • 定義__main__,一些腳本依賴於該檢查如果他們正在加載作爲一個模塊或不爲例如。 if __name__ == "__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")