2016-10-15 8 views
1

VK用のプライベートオンラインPythonインタプリタを書いています。これは、IDLEコンソールを密接にシミュレートします。私とホワイトリストの一部の人だけがこの機能を使用できます。私のサーバーに害を及ぼす可能性のある安全でないコードはありません。しかし、私は少し問題があります。たとえば、コードdef foo():で文字列を送信し、SyntaxErrorを取得したくないのに、長い文字列を\nで書き込むことなく、行ごとに関数を定義し続ける。その場合、exec()eval()は私に合っていません。希望の効果を得るために何を使用すべきですか?申し訳ありません重複している場合は、それでも似たような質問からそれを取得しないでください。Simulate Python対話モード

答えて

2

Python標準ライブラリには、codecodeopモジュールが用意されています。また、より詳細な制御と、それがどのように動作するかのカスタマイズのためのいくつかの機能を提供し

import code 
code.interact() 

codeモジュールだけストレートアップは、標準の対話インタプリタをシミュレートします。

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. 

あなたはより基本的な構成要素から物事を構築したい場合は、codeopモジュールは__future__文を覚えているし、不完全なコマンドを認識し、コマンドコンパイラを提供します

2

これは無限ループに

exec <code> in globals,locals 

次に、入力を読み取るまで沸騰。

IPython.frontend.terminal.console.interactiveshell.TerminalInteractiveSh ell.mainloop()

inputsplitter.push_accepts_more()で継続検出が行われるのは、ast.parse()です。

実際、IPythonには既にJupyter Notebookと呼ばれるインタラクティブなWebコンソールが用意されているため、再利用することをお勧めします。

関連する問題