python 3中execfile的替代方法是什麼?

看來他們在Python 3中取消了全部簡單的方法,即經過刪除execfile()快速加載腳本 html

我是否有明顯的替代品? python


#1樓

根據文檔 ,而不是 ide

execfile("./filename")

採用 編碼

exec(open("./filename").read())

看到: spa


#2樓

正如最近在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 。 若是給出了localsglobals的語義,則它們與類定義中的locals和globals類似。 get

  • run_path不只能夠執行文件,還能夠執行蛋和目錄(有關詳細信息,請參閱其文檔)。


#3樓

這就是我所擁有的(兩個示例中的文件都已使用源代碼將文件分配到file的路徑):

execfile(file)

這是我替換爲的內容:

exec(compile(open(file).read(), file, 'exec'))

我最喜歡的部分:第二個版本在Python 2和3中均可以正常工做,這意味着沒必要添加依賴於版本的邏輯。


#4樓

這是更好的方法,由於它從調用者那裏獲取了全局變量和本地變量:

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)

#5樓

儘管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")

筆記:

  • 使用二進制讀取以免編碼問題
  • 保證關閉文件(Python3.x警告)
  • 定義__main__ ,某些腳本依賴於此來檢查它們是否做爲模塊加載,例如。 if __name__ == "__main__"
  • 對於異常消息,設置__file__更好,某些腳本使用__file__來獲取其餘文件相對於它們的路徑。
  • 接受可選的globals和locals參數,就像execfile同樣就地對其進行修改-所以,您能夠經過在運行後回讀變量來訪問定義的任何變量。

  • 與Python2的execfile不一樣,這默認狀況下不會修改當前名稱空間。 爲此,您必須顯式傳遞globals()locals()

相關文章
相關標籤/搜索