看來他們在Python 3中取消了全部簡單的方法,即經過刪除execfile()
快速加載腳本 html
我是否有明顯的替代品? python
根據文檔 ,而不是 ide
execfile("./filename")
採用 編碼
exec(open("./filename").read())
看到: spa
正如最近在python-dev郵件列表上建議的那樣 , runpy模塊多是一個可行的替代方案。 引用該消息: code
https://docs.python.org/3/library/runpy.html#runpy.run_path htm
import runpy file_globals = runpy.run_path("file.py")
execfile
有細微的差異: ip
run_path
始終建立一個新的名稱空間。 它做爲模塊執行代碼,所以全局變量和init_globals
變量之間沒有區別(這就是爲何只有init_globals
參數的緣由)。 返回全局變量。 文檔
在當前名稱空間或給定名稱空間中執行的execfile
。 若是給出了locals
和globals
的語義,則它們與類定義中的locals和globals類似。 get
run_path
不只能夠執行文件,還能夠執行蛋和目錄(有關詳細信息,請參閱其文檔)。
這就是我所擁有的(兩個示例中的文件都已使用源代碼將文件分配到file
的路徑):
execfile(file)
這是我替換爲的內容:
exec(compile(open(file).read(), file, 'exec'))
我最喜歡的部分:第二個版本在Python 2和3中均可以正常工做,這意味着沒必要添加依賴於版本的邏輯。
這是更好的方法,由於它從調用者那裏獲取了全局變量和本地變量:
import sys def execfile(filename, globals=None, locals=None): if globals is None: globals = sys._getframe(1).f_globals if locals is None: locals = sys._getframe(1).f_locals with open(filename, "r") as fh: exec(fh.read()+"\n", globals, locals)
儘管exec(open("filename").read())
一般是execfile("filename")
的替代選擇,但它忽略了execfile
支持的重要細節。
Python3.x的如下功能與直接執行文件具備相同的行爲。 匹配運行python /path/to/somefile.py
。
def execfile(filepath, globals=None, locals=None): if globals is None: globals = {} globals.update({ "__file__": filepath, "__name__": "__main__", }) with open(filepath, 'rb') as file: exec(compile(file.read(), filepath, 'exec'), globals, locals) # execute the file execfile("/path/to/somefile.py")
筆記:
__main__
,某些腳本依賴於此來檢查它們是否做爲模塊加載,例如。 if __name__ == "__main__"
__file__
更好,某些腳本使用__file__
來獲取其餘文件相對於它們的路徑。 接受可選的globals和locals參數,就像execfile
同樣就地對其進行修改-所以,您能夠經過在運行後回讀變量來訪問定義的任何變量。
與Python2的execfile
不一樣,這默認狀況下不會修改當前名稱空間。 爲此,您必須顯式傳遞globals()
和locals()
。