안녕하세요?


지난번 포스팅에서 2가지 문제에 부딪쳤다는 것을 언급했는데, 일단 _MEIPASS를 가지고서 하는 txt파일을 조작하는 것은 지금은 너무 난이도가 높다는 생각이 들어서, 프로세스가 이유없이 계속해서 프리징(freezing)이라고해서 정지되어 버리는 것을 먼저 해결해 보아야 겠다는 생각이 들었습니다. 그래서 이번 포스팅부터는 이에 관련된 일련의 시도를 올리고자 합니다.



먼저 이전에는 그냥 os.system()이라는 함수로 exe파일을 실행시켰는데, 그렇게 하지말고, subprocess라는 모듈을 가지고 와서, 이 모듈의 명령어를 이용해서 다른 프로세스를 실행시켜 보도록 합니다.



일단 기존에 os.system은 주석처리를 하도록 하고, 일단 간단하게 자식 프로세스를 실행시킬 수 있는 명령어인 subprocess.run()이라는 명령어를 처리해 주도록 합니다.



일단 실행까지는 되기는 되었습니다만, 문제는 이러고도 여전히 프로그램이 얼어붙는-정지되어 버리는 현상이 계속해서 발생하는 것을 볼 수 있었습니다.



그래서 일단 새로운 exe파일을 만들어 보도록 합니다. 이번에는 RLTrader의 마지막에 return이라는 명령이 없어서 이런 일이 생긴 것이 아닌가 해서, return명령어를 넣어주고 한번 exe파일로 만들어서 실행을 시켜 보고자 하는 것 입니다.




그런데 이렇게 하고도 여전히 계속해서 프로그램 자체가 정지되어 버리는 현상은 나아지지 않고 있는 것을 볼 수 있었습니다.



그래서 한번 인터넷을 뒤져본 끝에, 위 스크린샷처럼 sys.platform.startswith("win"):이라고 해서, 윈도우즈로 운영체제가 되어 있다고 하면, ctypes라는 모듈을 가져오는데, 이 모듈은 C호환 데이터형을 제공하는 외부 함수 라이브러리가고 합니다. 그래서 이렇게 한 다음, subprocess_flags라는 것을 0x8000000 이라고 했는데, 원래는 타이핑으로 CREATE_NO_WINDOW이지만, 이렇게 하면 변수로 인식하기 때문에 하는 수 없이 이렇게 숫자로 입력해야 했습니다.



다음으로 아래에는 subprocess라는 것을 Popen이라는 함수로 실행을 시키는데, 여기서 위에 설정해둔 subprocess_flags라는 것이 바로 creationflags=라는 옵션의 값으로 사용이 되기 때문입니다. 이렇게 하고 나서 이후에 오는 communicate()라는 함수는 바로 자식 프로세스가 실행된 다음에 종료가 될 때까지 기다리라는 명령어 입니다.



이제 준비는 다 되었으니, 한번 실행을 시켜 봐서 무언가가 달라지는 지를 살펴 보고자 합니다.




이번에도 역시나 상황이 나아지지 않는 것을 볼 수 있었습니다.



그리고 나서 어디가 문제인지 다시 한번 찾아보니, 이번에는 close_fds=라는 옵션으로 부모 프로세스를 종료하고 자식 프로세스를 실행시킨다와 같은 옵션을 켜 보았습니다.



다시한번 실행을 시켜 보도록 합니다.



이번에도 특별히 차이점이 없는게 아니라, 이번에는 아예 윈도우가 중간에 꺼져 버려서-프로그램이 그냥 종료되어 버리는 현상이 벌어지는 것을 볼 수 있었습니다. 즉, 자식 프로세스가 실행이 되었는지 아닌지 알아보기도 전에 부모 프로세스인 pytrader가 그냥 종료되어 버려서 도저히 무엇이 어떻게 된 것인지 알 수 없었습니다.


+ Recent posts