ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 문자열을 입력하면 코드로 실행해주는 exec, eval 함수 사용해보기
    Python/파이썬 기초 2023. 4. 20. 09:26
    반응형

    문자열을 입력하면 코드로 실행해주는 exec, eval 함수 사용해보기


    제가 지금 만들고 있는 프로그램에서 파이썬 코드를 입력하면 그 결과를 보여주는 기능이 필요했습니다. 그런데, 저는 지금까지 저 혼자 사용하는 프로그램 이외에는 만들어본 적이 없었답니다. 파이썬을 잘 모르는 사람이 쓸건데, 소스코드를 알아서 수정하라고 하면 프로그램을 만드는 의미가 없겠지요. 예를 들어, 이런 느낌입니다.

     

     

    여기 py 파일 보이시죠? 이 파일의 몇번째 줄에 원하는 코드를 적으시고... 아뇨, 그렇게 하면 에러가 나니까 띄어쓰기 하지 마시고요!...

     

     

    이런 말을 할 생각을 하니 벌써부터 어질어질합니다. 이런 상황을 막기 위해서는, 누군가가 코드를 입력하면 실행 결과를 알려주도록 하는 코드가 필요합니다. 이 때는 flake8이라는 정적 분석 패키지를 이용해도 좋지만, 이번에는 다른 접근을 해 볼게요. 바로, execeval이라는 함수입니다.

     

     

    exec은 명령어를 실행한다 할때의 execute라는 뜻을 가진 함수입니다. 문자열로 주어진 수식을 실행하는 기능을 가지고 있지요. 예를 들어, print(1+2+3)이라는 코드를 입력하고, 그걸 실행하려 한다면 이 함수를 통해서 실행할 수 있습니다.

     

     

    # 우선 코드를 입력해 줍니다. print(1+2+3)로 입력하면 되겠죠!
    code = input('원하는 코드를 입력하세요')
    
    # 다음에는 실행입니다
    print('입력한 코드가 실행됩니다...')
    exec(code)
    원하는 코드를 입력하세요 print(1+2+3)
    
    
    입력한 코드가 실행됩니다...
    6

     

     

    이정도면 괜찮은것 같습니다. 그런데, 이 프로그램에는 문제가 하나 있어요. 만약, print(1+2+3)이 아니라, 그냥 1+2+3을 입력한다면 코드 실행 결과를 알 수 없다는 점이지요. (print 함수와는 달리, 출력이 아니라 리턴을 하기 때문입니다)

     

     

    이 때는, 실행 결과를 별도로 출력해야 하는데, exec 함수는 아쉽게도 결과를 리턴하지 않습니다. 그렇다면, 결과를 리턴해주는 eval 함수를 알아보도록 하지요.

     

     

    # 1+2+3 이라고 입력한다면...
    code = input('원하는 코드를 입력하세요')
    
    # exec 함수의 경우
    print('exec 함수로 코드가 실행됩니다...')
    print(exec(code))
    print('------------------------------')
    
    # eval 함수의 경우
    print('eval 함수로 코드가 실행됩니다...')
    print(eval(code))
    원하는 코드를 입력하세요 1+2+3
    
    
    exec 함수로 코드가 실행됩니다...
    None
    ------------------------------
    eval 함수로 코드가 실행됩니다...
    6

     

     

    이렇게 차이를 보여주듯이, eval 함수(evaluate라는 뜻입니다)는 exec 함수와는 달리 주어진 코드를 실행하고, 그 코드의 리턴값을 그대로 리턴해주는 기능을 가지고 있습니다.

     

     

    문자열로 코드가 주어졌다면, 이걸 실행할 수 있는 execeval 함수를 각각 알아보았습니다. 편리한 함수이지만, 변경이 가능한 문자열을 바탕으로 코드를 실행하기 때문에, 의도치 못한 실행 결과가 생길 수 있다는 점(보안상의 문제가 있습니다) 주의하면서 사용해 보시기 바랍니다.

    반응형

    댓글

문의: jwkang3929@naver.com