2013-01-19 191 views
0

我想要做下面的事情。腳本有一些python代碼作爲一個字符串(保存在一個變量中),並可以運行該代碼嗎?在python腳本中運行python代碼

嗯,我知道一種方法,將該字符串寫入文件&運行它,但我不希望這樣。如果不創建任何額外的文件,是否可以運行它?

這裏有一個例子:

假設我的Python文件內容如下

#this is a main python file 
content = ''' print 'hello!' 
        print 'this is from sub python code' ''' 
print 'from main python' 

內容串有Python代碼&我要運行它。可能嗎 ?

希望我清楚。謝謝 !

+0

@Blender - 謝謝編輯。我從移動設備上發佈了這個消息,在我意識到之前,你已經編輯了它。 :) – avi

+2

你能告訴我們爲什麼有一個代碼的字符串呢?爲什麼不只是將字符串更改爲函數?如果它是從其他地方讀取的數據,那麼如果你不相信源,就會讓自己開始受到傷害。 –

+0

@Ned Batchelder - 糟糕,我沒有得到這個想法。但是,如何將字符串更改爲函數,而不寫入其他文件? 我不是從任何不受信任的來源讀取數據。我只是在試驗。感謝警告,我會小心的。 – avi

回答

2

我會先說這個:這是一個可怕的想法,並且根據字符串的來源有嚴重的安全風險。

這個免責聲明,python有一個exec函數,它執行一個包含python代碼的字符串。例如:

exec("print 2+2") 

編輯:我最初使用EVAL在我的答案,這是評價個人表現非常有用,而高管可用於在一個字符串的任意Python代碼更普遍執行。

相關的文檔:

http://docs.python.org/2/reference/simple_stmts.html#exec

http://docs.python.org/2/library/functions.html#eval

+0

我不讀取任何不受信任的來源的數據。我只是在試驗。感謝警告,我會小心的。 可以評估運行完整的Python代碼?與進口圖書館和東西? 感謝您的回覆! – avi

+0

所以我確實在eval的確切機制上有點生疏,而exec對於這類事情會更合適。我會編輯我的答案來澄清。 – jrdn

+0

好的,eval並不適用於語句及其唯一的表達式。 – avi

0

那麼你可以使用eval

eval(content) 

這會做你想做的,但它不推薦,特別是如果有人else控制着content的內容 - 破解int並不難如果你有eval

+0

我不是從任何不受信任的來源讀取數據。我只是在試驗。感謝警告,我會小心的。 謝謝你的回覆! – avi

0

你有沒有試着用exec方法爲每個文檔應該做

高管「打印‘你好,世界!’」

+0

工作完美,謝謝! – avi

+0

請標記爲答案,如果它幫助你.. –

0

根據您要執行的代碼Ø系統,您可以使用eval()exec。這兩個選項有幾個區別:

  1. eval()做它應該做的:它評估一個表達式並返回一個值,而不是執行代碼。這意味着你可以調用函數,做一些算術運算,甚至使用列表解析,生成器或lambda表達式,但不執行不是表達式的Python語句(例如,Python 2中的iffor,print;但是在Python 3中,print是一個函數並沒有問題)。
  2. eval()接受的參數不只是一個字符串。它得到localsglobals兩個詞典,定義範圍環境。如果您填寫並傳遞這些字典到eval(),您可能會對不可信的字符串進行近乎(但不是真正的)安全評估。也許,你甚至可以通過全局設置__builtins__來重新定義builtins。 http://docs.python.org/2/library/functions.html#eval
  3. exec也接受全局和本地人。見http://docs.python.org/2/reference/simple_stmts.html#exec。它可能會執行一切。而且幾乎不可能使其更安全。