Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬에서 exec()

<시간/>

Exec 함수는 파이썬 프로그램의 코드를 동적으로 실행할 수 있습니다. 코드는 이 함수에 문자열 또는 개체 코드로 전달할 수 있습니다. 객체 코드는 문자열이 먼저 구문 분석되고 구문 오류가 있는지 확인하는 동안 그대로 실행됩니다. 구문 오류가 없으면 구문 분석된 문자열을 파이썬 문으로 실행합니다.

exec() 함수의 구문

exec(object, globals, locals)

어디에

  • 개체 − 메서드에 전달된 문자열 또는 코드 개체.

  • 전 세계 − 사용 가능한 전역 메서드 및 변수의 사전.

  • 현지인 − 사용 가능한 로컬 메서드 및 변수의 사전.

문자열 전달

아래 예제에서 우리는 exec() 함수에 문자열로 한 줄의 코드를 전달합니다. Itr은 구문 분석되고 실행되어 출력을 제공합니다.

x = 9
exec ('print(5*x)')

출력

위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -

45

코드 개체 전달

이제 우리는 여러 코드 문으로 코드 블록을 전달하는 방법을 봅니다. 코드 객체이므로 직접 실행되어 결과를 제공합니다. 적절한 들여쓰기가 있는 python 코드 블록을 생성하기 위해 \n과 공백을 어떻게 사용했는지 주목하십시오.

prog_block = 'x = 3 \nif(x < 5): \n print x*x'
exec(prog_block)

출력

위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -

9

전역 및 로컬 매개변수 없음

전역 및 지역 매개변수에 대한 값을 전달하지 않으면 프로그램으로 가져온 패키지에 따라 기본 사용 가능한 기능을 얻습니다. 아래 예제에서 우리는 전역 및 지역 매개변수 값을 모두 건너뛸 때 사용 가능한 모든 기능을 제공하는 코드를 봅니다.

from time import *
exec("print(dir())")

위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -

['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__file__', '__name__', 
'__package__', '_dh', '_exit_code', '_i', '_i1', '_i10', '_i11', '_i12', '_i13', '_i14', '_i15',
 '_i16', '_i17', '_i18', '_i19', '_i2', '_i20', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'clock', 
'copysign', 'cos', 'cosh', 'ctime', 'daylight', 'degrees', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 
'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'get_ipython', 'gmtime', 'hypot', 
'isinf', 'isnan', 'ldexp', 'lgamma', 'localtime', 'log', 'log10', 'log1p', 'mktime', 'modf', 'pi', 
'pow', 'prog', 'prog_block', 'quit', 'radians', 'sin', 'sinh', 'sleep', 'sqrt', 'strftime', 'strptime', 
'struct_time', 'tan', 'tanh', 'time', 'timezone', 'trunc', 'tzname', 'x']

전역 매개변수로 제한 적용

빈 사전을 전역 매개변수로 전달하여 가져온 모듈의 모든 기능에 대한 액세스를 제한할 수 있습니다. 이 경우 결과에는 내장 함수만 표시되고 가져온 모듈의 함수는 표시되지 않습니다. 이것이 우리가 기능을 제한하고 더 안전하게 만드는 방법입니다.

from time import *
exec("print(dir())",{})

출력

위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -

['__builtins__']

선택한 기능만 허용

다음으로 가져온 모듈의 exec() 메서드에 선택한 특정 함수만 적용하는 방법을 봅니다. 아래 예에서는 전역 옵션이 있는 매개변수로 필요한 기능만 허용합니다. localtime() 함수는 프로그램에서 가져온 시간 모듈의 일부입니다.예

from time import *
exec("print lclt()",{"lclt":localtime})

출력

위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -

time.struct_time(tm_year=2019, tm_mon=7, tm_mday=19, tm_hour=12, tm_min=33, tm_sec=53, tm_wday=4, tm_yday=200, tm_isdst=0)

로컬 매개변수 전달

또한 로컬 매개변수를 사용하고 내장 기능을 완전히 제외하여 가져온 모듈에서 다양한 기능의 사용을 제한할 수 있습니다. 아래 예에서는 내장 전역 매개변수의 값으로 None을 선택합니다.

from time import *
exec("print(dir())", {"__builtins__" : None}, {"gtime": gmtime, "print": print, "dir": dir})

위의 코드를 실행하면 다음과 같은 결과가 나옵니다. -

['dir', 'gtime', 'print']