2021년 7월 4일 일요일

python 에서 script 사용하기, python 내에서 py 파일 실행 시키기, exec 사용하기, 인자 전달

 예전에 관련해서 글을 쓴적이 있습니다.

https://swlock.blogspot.com/2020/04/scripting-on-python.html

이때는 간단하게 테스트만 해봤는데 변수 전달의 경우 어떻게 해야할지 딱히 고민을 하지 않았었습니다. 막상 사용하려고 하면 변수는 전달이 되어야 쓸만할겁니다. 

그래서 테스트 해봤습니다.


놀랍게도 변수 전달도 아주 쉽게 되었습니다.

아래 예제를 참고 바랍니다.

main.py

global val1

val1 = 10
val2 = [10,20,30]

# py scriptiong
print("Script main")
print('main val1',val1)
print('main val2',val2)
data = exec(open('10_py_scripting_script.py').read())
print('return',data)
print('main val1',val1)
print('main val2',val2)

전역 변수로 val1, val2 를 만들고 스크립트전에 찍고 스크립트 호출후에 값을 출력하도록 만들었습니다.

10_py_scripting_script.py

print("in script")
print('__name__',__name__)
print('main val1',val1)
print('main val2',val2)
val1 = 100
val2[1] = 200


실행 결과

Script main
main val1 10
main val2 [10, 20, 30]
in script
__name__ __main__
main val1 10
main val2 [10, 20, 30]
return None
main val1 100
main val2 [10, 200, 30]


이정도면 훌륭한 결과 입니다. 전역 변수들도 쉽게 처리가 가능하니 에러 처리가 필요하면 제일 처음 초기화 후 제일 마지막에 결과를 변수에 저장하는 방식으로 함수가 정상적으로 수행되었는지 확인 하도록도 구현이 가능할겁니다.


sub에서 실행하는 파일은 자신의 파일 이름을 잃어버리고 호출한 쪽의 이름을 따라가게 됩니다.


핵심이 되는 exec 메소드를 찾아봤습니다.

https://docs.python.org/ko/3/library/functions.html#exec


실패던 성공이던 위 예제와 같이 리턴값은 None이 넘어옵니다. 

그래서 에러 처리를 위해서는 전역 변수를 이용하도록 하면 됩니다.







댓글 없음:

댓글 쓰기