Python コードを含む文字列を Python で実行するにはどうすればよいですか?
質問
Python コードを含む文字列を Python で実行するにはどうすればよいですか?
解決 2
の例では文字列はexec関数を使用してコードとして実行されます。
import sys
import StringIO
# create file-like string to capture output
codeOut = StringIO.StringIO()
codeErr = StringIO.StringIO()
code = """
def f(x):
x = x + 1
return x
print 'This is my output.'
"""
# capture output and errors
sys.stdout = codeOut
sys.stderr = codeErr
exec code
# restore stdout and stderr
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
print f(4)
s = codeErr.getvalue()
print "error:\n%s\n" % s
s = codeOut.getvalue()
print "output:\n%s" % s
codeOut.close()
codeErr.close()
他のヒント
ステートメントには、次を使用します exec(string)
(Python 2/3) または exec string
(Python 2):
>>> mycode = 'print "hello world"'
>>> exec(mycode)
Hello world
式の値が必要な場合は、次を使用します。 eval(string)
:
>>> x = eval("2+2")
>>> x
4
ただし、最初のステップは、本当に必要かどうかを自問することです。コードの実行は通常、最後の手段である必要があります。ユーザーが入力したコードが含まれる可能性がある場合、遅くて見苦しく、危険です。常に最初に高階関数などの代替案を検討し、ニーズをよりよく満たせるかどうかを確認する必要があります。
eval
とexec
は正しい解決策であり、それらは、のより安全なのように使用することができます。
Pythonのリファレンスマニュアルと明確に説明したこののチュートリアルでは、eval
とexec
機能は、余分な2を取りますユーザーはグローバルとローカル関数や変数が利用可能であるかを指定することができパラメータます。
例
public_variable = 10
private_variable = 2
def public_function():
return "public information"
def private_function():
return "super sensitive information"
# make a list of safe functions
safe_list = ['public_variable', 'public_function']
safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])
# add any needed builtins back in
safe_dict['len'] = len
>>> eval("public_variable+2", {"__builtins__" : None }, safe_dict)
12
>>> eval("private_variable+2", {"__builtins__" : None }, safe_dict)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'private_variable' is not defined
>>> exec("print \"'%s' has %i characters\" % (public_function(), len(public_function()))", {"__builtins__" : None}, safe_dict)
'public information' has 18 characters
>>> exec("print \"'%s' has %i characters\" % (private_function(), len(private_function()))", {"__builtins__" : None}, safe_dict)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'private_function' is not defined
は、本質的にはあなたがその中でコードが実行される名前空間を定義している。
バージョンから3 exec
が関数であることを忘れないでください!
そう常にexec(mystring)
の代わりexec mystring
を使用します。
eval()
はeval('x+1')
の作品ながら、eval('x=1')
は、例えば動作しません、ただの表現のためです。その場合には、それがさらに良くexec
、またはを使用することをお勧めします:より良い解決策を見つけることを試みる:)
避ける exec
そして eval
使用する exec
そして eval
Python では非常に眉をひそめられます。
もっと良い代替手段があります
一番上の答えから(私のものを強調):
ステートメントには、次を使用します
exec
.式の値が必要な場合は、次を使用します。
eval
.ただし、最初のステップは、本当に必要かどうかを自問することです。 コードの実行は通常、最後の手段として行う必要があります。:ユーザーが入力したコードが含まれる可能性がある場合、遅くて見苦しく、危険です。常に見ておくべきです 高階関数などの代替案が最初にあります, 、これらがニーズをよりよく満たすことができるかどうかを確認します。
文字列内の名前を持つ変数の値を設定および取得する
[その間
eval
] は機能しますが、プログラム自体に意味を持つ変数名を使用することは一般的にお勧めできません。代わりに、dict を使用することをお勧めします。
慣用句ではありません
から http://lucumr.pocoo.org/2011/2/1/exec-in-python/ (私のことを強調)
PythonはPHPではありません
他の言語ではやり方が異なるため、Python のイディオムを回避しようとしないでください。名前空間が Python にあるのには理由があって、 それはあなたにツールを与えるという理由だけで
exec
そのツールを使用する必要があるという意味ではありません。
危険です
から http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html (私のことを強調)
したがって、すべてのグローバルと組み込みを削除したとしても、eval は安全ではありません。
これらすべての問題 eval() を保護しようとするのは、それらがブラックリストであるということです。. 。危険な可能性のあるものは明確に削除されます。それは負け戦だから リストに項目が 1 つだけ残っている場合は、システムを攻撃できます.
では、eval を安全にすることができるでしょうか?言いにくい。現時点では、二重アンダースコアを使用できなくても害を及ぼすことはないと考えられるため、おそらく二重アンダースコアを含む文字列を除外すれば安全であると考えられます。多分...
読んで理解するのが難しい
から http://stupidpythonideas.blogspot.it/2013/05/why-evalexec-is-bad.html (私のことを強調):
初め、
exec
人間がコードを読むのが難しくなります. 。何が起こっているのかを理解するには、コードを読むだけではなく、 コードを読んで、どのような文字列が生成されるかを把握してから、その仮想コードを読み取る必要があります。 したがって、チームで作業している場合、オープンソース ソフトウェアを公開している場合、または StackOverflow のような場所で助けを求めている場合、他の人があなたを助けてくれるのが難しくなります。そして、今から 6 か月後にこのコードをデバッグしたり拡張したりする可能性がある場合、自分自身にとって直接的な困難が生じることになります。
あなたは、次のIDLEセッションのように、EXECを使用してコードを実行を達成する上記ます:
>>> kw = {}
>>> exec( "ret = 4" ) in kw
>>> kw['ret']
4
を使用 evalをするます。
チェックのevalするます:
x = 1
print eval('x+1')
->2
言及する価値がある、それは」 exec
の兄弟も存在します。 execfile
Python ファイルを呼び出したい場合。これは、ひどい IDE が含まれているサードパーティのパッケージで作業していて、そのパッケージの外でコードを書きたい場合に適している場合があります。
例:
execfile('/path/to/source.py)'
または:
exec(open("/path/to/source.py").read())
、それは "実行" です..
しかし、あなたのコードは、変数が含まれている場合には、次のエラーを上げるために、コンパイラを防ぐためにも、それをアクセスするために、「グローバル」を使用することができます:
NameError:名 'p_variable' が定義されていません。
exec('p_variable = [1,2,3,4]')
global p_variable
print(p_variable)
[OK]を..私は、これはまさに私があったように、この時に探している人々のための答えが、おそらくノートではありません知っています。私は別のユーザー/顧客のために特定のコードを実行したかっただけでなく、幹部/ evalのを避けたかったです。私は、最初に、各ユーザのためにデータベース内のコードを格納し、上記のことに見えます。
私はその顧客のために適用されるフィルタが、それは単に
に行わない場合は、「customer_filters」フォルダ内のファイルシステム上のファイルを作成し、「IMP」モジュールを使用して終了import imp
def get_customer_module(customerName='default', name='filter'):
lm = None
try:
module_name = customerName+"_"+name;
m = imp.find_module(module_name, ['customer_filters'])
lm = imp.load_module(module_name, m[0], m[1], m[2])
except:
''
#ignore, if no module is found,
return lm
m = get_customer_module(customerName, "filter")
if m is not None:
m.apply_address_filter(myobj)
CUSTOMERNAME = "JJ" そう customer_filtersからapply_address_filterを実行します\ jj_filter.pyファイル