파이썬에서 파이썬 코드를 포함하는 문자열을 어떻게 실행합니까?
답변
문장의 경우 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
그러나 첫 번째 단계는 정말로 필요한지 스스로에게 물어보아야합니다. 실행 코드는 일반적으로 최후의 수단이되어야합니다. 사용자가 입력 한 코드를 포함 할 수 있으면 속도가 느리고 추악하며 위험합니다. 고차 함수와 같은 대안을 먼저 살펴보고 이것이 더 나은 요구를 충족시킬 수 있는지 확인해야합니다.
답변
이 예에서 문자열은 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()
답변
eval
그리고 exec
올바른 솔루션이며, 그들은이에서 사용할 수있는 안전한 방법.
에서 설명하고있는 바와 같이 파이썬의 참조 설명서를 명확하게 설명 이 튜토리얼의 eval
과 exec
기능은 사용자가 글로벌 및 지역 함수와 변수가 사용할 수있는 지정할 수있는 두 개의 추가 매개 변수를.
예를 들면 다음과 같습니다.
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
파이썬에서 를 것은 매우 찡그림입니다.
더 나은 대안이 있습니다
최고 답변 (강조 광산)에서 :
진술을 위해
exec
.식의 값이 필요한 경우을 사용하십시오
eval
.그러나 첫 번째 단계는 정말로 필요한지 스스로에게 물어보아야합니다. 실행 코드는 일반적으로 최후의 수단이되어야 합니다. 사용자가 입력 한 코드를 포함 할 수 있으면 느리고, 추악하고, 위험합니다. 고차 함수와 같은 대안을 먼저 살펴 보고 이것이 더 나은 요구를 충족시킬 수 있는지 확인해야합니다.
문자열 이름으로 변수 값 설정 및 가져 오기
eval
작동 하는 동안 일반적으로 프로그램 자체에 의미가있는 변수 이름을 사용하지 않는 것이 좋습니다.대신 dict을 사용하는 것이 좋습니다.
관용적이지 않다
에서 http://lucumr.pocoo.org/2011/2/1/exec-in-python/ (강조 광산)
파이썬은 PHP가 아니다
다른 언어에서는 다르게 사용하기 때문에 파이썬 관용구를 우회하려고하지 마십시오. 네임 스페이스는 이유 가 있기 때문에 파이썬으로되어 있으며 도구를 제공한다고해서 해당 도구
exec
를 사용해야한다는 의미는 아닙니다.
위험 해요
에서 http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html (강조 광산)
따라서 모든 지구본과 내장을 제거하더라도 eval은 안전하지 않습니다!
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