[Python] PyCharm에서 임의의 코드를 디버깅하는 방법 Develop Tip

파이썬에서 특정 문자열의 코드를 수행시키려면,
exec(...) 빌트인 함수를 이용합니다.

예를 들어,

code = """
def myrun():
    def sum(i, j):
        return i + j
    
    # pdb.set_trace()
    i = 1
    j = 2
    k = sum(i, j)
    print('sum of %s, %s = %s' % (i, j, k))
if __name__ == '__main__':
    myrun()
"""

위와 같은 code라는 문자열에 어느 파이썬 코드가 들어가 있다고 하였을 때,

exec(code)

라고 실행하면 해당 코드가 실행됩니다.

그런데 이 방법을 이용하면 PyCharm 과 같은 IDE에서 해당 코드를
디버깅 할 수 있는 방법이 없습니다.

여러가지 시행착오를 거쳐 다음과 같은 방법을 얻었습니다.

테스트 환경은 다음과 같습니다.
OS: macOS
Python: 3.6.2 (3.5+ 에서 동작합니다)


위와 같이 해당 코드를 불러와서 디버깅을 해 봅니다.

위 과정은 해당 코드를 foo.py 라는 모듈로 저장합니다.
(저장되는 폴더는 해당 파이썬 인터프리터가 알고 있는 패스입니다)

        spec = importlib.util.spec_from_file_location("foo", cf)
        foo = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(foo)

16~18 줄의 위의 코드가 dynamic 하게 해당 코드를 읽어 import 하는 부분입니다.

이제 foo라는 것은 실제 모듈과 동일하게 이용할 수 있으므로,

위와 같이 19줄에서 멈춘 다음 F7 (Step Into)를 하면,

실제 dynamic 하게 한들어진 foo.py 소스 코드로 들어가서 디버깅 할 수 있는 것을 볼 수 있습니다.

다시 원 소스로도 잘 돌아오며, 실행이 완료된 후 finally 에서 해당 코드를 삭제해 버렸습니다.
결과는 static 하게 준 것과 동일하게 잘 동작하고 디버깅할 수 있었습니다.


어느 분께는 도움이 되셨기를 ..

덧글

댓글 입력 영역

구글애드텍스트