在 Python 中執行指令碼
本文將討論如何使用 Python 執行另一個 Python 指令碼。
在 Python 中執行 Python 指令碼
我們可以在 exec()
函式的幫助下使用 Python 執行 Python 指令碼。exec()
函式是一個 Python 實用程式,它允許以字串和位元組格式動態執行 Python 程式碼。該函式接受三個引數,即
object
:字串或位元組格式的 Python 程式碼globals
:這是一個可選引數。它是一個字典,包含全域性函式和變數。locals
:這是一個可選引數。它是一個字典,包含區域性函式和變數。
示例請參考以下程式碼。
file_name = "code.py"
content = open(file_name).read()
exec(content)
上面的程式碼首先在工作目錄中開啟一個名為 code.py
的檔案,讀取其內容,將其儲存在名為 content
的變數中,然後將讀取的內容傳遞給 exec()
功能。讀取的內容是一些 Python 程式碼,exec()
方法將執行該 Python 程式碼。
如果我們有一些區域性或全域性變數,我們可以將它們儲存在字典中並將它們傳遞給可執行指令碼。然後指令碼將能夠利用這些變數並執行程式碼。請注意,如果我們在可執行指令碼中使用一些未作為全域性變數傳遞的函式,主程式將丟擲異常。
以下程式碼描述了相同的內容。
from random import randint
code = "print(randint(1, 6))"
exec(code, {}, {}) # Empty globals and locals
輸出:
Traceback (most recent call last):
File "<string>", line 4, in <module>
File "<string>", line 1, in <module>
NameError: name 'randint' is not defined
當 globals
和 locals
未傳遞給 exec()
時,將自動處理(執行指令碼)要求。Python 足夠聰明,可以找出執行指令碼所需的所有變數或函式。例如,以下程式碼將完美執行,不會出現任何錯誤。
from random import randint
code = "print(randint(1, 6))"
exec(code) # No globals or locals passed
globals
和 locals
的使用
我們可以通過 globals
將自定義函式和匯入函式傳遞給 exec()
函式,從而在可執行指令碼中建立自定義函式和匯入函式。如上所述,如果找不到這些依賴項,則會引發異常。
參考以下程式碼。在這裡,我們將定義一個自定義函式並從 random
包中匯入一個函式。然後這兩個函式將通過 globals
引數傳遞給包含在字典中的 exec()
函式。
from random import randint
def get_my_age():
return 19
globals = {"randint": randint, "get_my_age": get_my_age}
code = """
print(randint(1, 6))
print(get_my_age())
"""
exec(
code,
globals,
)
輸出:
5 # It can be any number between 1 and 6, both inclusive
19
現在,這些函式已通過 globals
引數傳遞。我們也可以通過本地人
傳遞它們。由於 exec
函式不接受關鍵字引數,我們必須為 globals
傳遞一個空字典,並傳出 locals
。
from random import randint
def get_my_age():
return 19
locals = {"randint": randint, "get_my_age": get_my_age}
code = """
print(randint(1, 6))
print(get_my_age())
"""
exec(code, {}, locals)
輸出:
2 # It can be any number between 1 and 6, both inclusive
19