在 Python 中執行指令碼

Vaibhav Vaibhav 2023年1月30日 2022年5月17日
  1. 在 Python 中執行 Python 指令碼
  2. globalslocals 的使用
在 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

globalslocals 未傳遞給 exec() 時,將自動處理(執行指令碼)要求。Python 足夠聰明,可以找出執行指令碼所需的所有變數或函式。例如,以下程式碼將完美執行,不會出現任何錯誤。

from random import randint

code = "print(randint(1, 6))"
exec(code) # No globals or locals passed

globalslocals 的使用

我們可以通過 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
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

LinkedIn GitHub