Skip to content

[Python] 使用 exec() 函式將字串當作程式碼執行

Last Updated on 2021-03-28 by Clay

在 Pyhton 原生提供的眾多函式裡頭,有一個叫做 "exec()" 的函式,在某次 Meeting 前夕救了我一命。為了感激(?)這個函式,我就特別寫了一篇關於這個函式使用方法的介紹,希望能夠幫助到所有跟我一樣有這個需求的人們。

首先,我來講講這個 "exec()" 函式究竟有什麼功用吧!

在撰寫程式碼的過程中,我們難免會遇到一些情況逼得我們不得不在程式碼中動態新增我們所需要使用的程式,而這種情況相當少見(至少我寫程式寫了這些年只碰過那麼一次),但有些時候就剛好需要這樣的功能。


簡單介紹 "exec()"

舉個例子來說明吧。以下,這是一個基本的 Python 腳本,我們將要執行的程式碼儲存成字串 (string 資料型態) 並將其賦值給變數 "text_01"。

然後,我們使用這個變數輸入 "exec()" 函式當中。

text_01 = """print('Hello World!')"""
exec(text_01)


Output:

Hello World!

如何?是不是真的印出來了呢?這就是 "exec()" 函是的公用:將輸入的字串當作 Python 程式碼來執行。


輸入參數

當然,我們也可以從外部輸入我們在新增的那段程式碼中所需要的參數,比如:

text_02 = """
print('{}天氣真{}!')""".format('今天', '好')
exec(text_02)


我們可以看到我們即將執行的程式碼中包含著『{}』的符號,那便是我們後頭用 format 輸入的字。在這裡我們分別將兩個空格填上『今天』跟『好』。

今天天氣真好!

我們便會輸出像這樣的句子。


運算

當然,不只是字串 (str),數字 (int) 當然也是可以運算的。

text_03 = """
a = {}
b = {}
print(a+b)""".format(1, 5)
exec(text_03)


Output:

6

呼叫函式

不僅如此,如果我們在外部的程式碼中定義好了一個函式,我們也可以在動態新增的程式碼中呼叫它:

def sumOf(a, b):
    return a+b


text_04 = """
a = {}
b = {}
print(sumOf(a, b))""".format(1, 5)
exec(text_04)


輸出的結果也會跟剛才一樣:

6

報錯處理

不過有時候,也會發生找不到我們剛剛定義的那個函式的情況發生:

像以上這張圖例的報錯。

這時候,我們可能就得在動態新增的程式碼部份 import 進這個我們剛寫好的函式。

from exec_example import sumOf


加上這行,我們便可以呼叫我們剛撰寫的函式了。(exec_example 是我這個 .py 檔的名稱,你也需要改成你的。)


回傳結果

最後,提及一下怎麼從動態新增的程式碼部份把『變數』提取出來吧。

def sumOf(a, b):
    return a+b

text_05 = """
from exec_example import sumOf
a = {}
b = {}
total = sumOf(a, b)
""".format(7, 8)

Vars = {}
exec(text_05, Vars)
print(Vars['total'])


我們在外部先定義了一個 dictionary 的變數 Vars,然後也將其輸入 exec() 函式。

在執行完我們的動態程式碼後,我們便可以使用 Vars['total'] 這樣的形式來查看動態程式碼中 total 的值。

15

後記

那麼以上,便是關於 Python 中關於 "exec()" 函式的簡單紀錄。雖然這應該是個相當稀少會使用到的情況,但真的能在需要的時候發揮奇效。

希望能夠幫助到所需要的人。

Leave a Reply