2016-10-15 189 views
1

我正在爲VK編寫一個私人在線Python解釋器,它將密切模擬IDLE控制檯。只有我和白名單中的一些人才能使用此功能,沒有不安全的代碼會損害我的服務器。但我有一個小問題。例如,我發送字符串代碼爲def foo():,我不想獲得SyntaxError,但繼續逐行定義函數,而不使用\n編寫長字符串。在這種情況下,exec()eval()不適合我。我應該用什麼來獲得所需的效果?對不起,如果重複,仍然不會從類似的問題得到它。模擬Python交互模式

回答

2

Python標準庫提供了codecodeop模塊來幫助您解決這個問題。該code模塊只是直線上升的模擬標準的交互式解釋:

import code 
code.interact() 

它還提供了更精細的控制和它是如何工作的定製一些設施。

如果你想從更基本的組件構建的事情了,在codeop模塊提供了一個命令編譯器記住__future__聲明並確認不完整的命令:

import codeop 
compiler = codeop.CommandCompiler() 

try: 
    codeobject = compiler(some_source_string) 
    # codeobject is an exec-utable code object if some_source_string was a 
    # complete command, or None if the command is incomplete. 
except (SyntaxError, OverflowError, ValueError): 
    # If some_source_string is invalid, we end up here. 
    # OverflowError and ValueError can occur in some cases involving invalid literals.