본문 바로가기
무모한 도전-주식 인공지능 만들기

다시금 시작해 보는 exe파일 만들기 작전-6-

by 인터넷떠돌이 2019. 1. 11.
반응형

안녕하세요?


지난번 포스팅에서는 한번 pytrader에서 한번에 마무리가 되었는 메서드를 2개로 나누어서 각각 실행을 하는 작전을 실행해 보았습니다만, 이게 통하지 않는 것을 보여드렸습니다. 그래서 마지막 수단으로, pyinstaller로 만들어낸 exe파일은 temporary인 폴더를 생성해서 거기다가 풀어서 한다는 이야기가 있었습니다. 이 내용 자체는 저로서는 이해하기 어렵습니다만, 결론부터 이야기를 하자면, exe파일을 pyinstaller를 만들 때 부터 좀 특별한 조치를 취해야 한다는 것 이었습니다.



먼저 해야 하는 일은 한번 pyinstaller로 한번 exe파일을 만들고 나면 생성이 되는 spec파일이 있는데, 여기서 원래는 []로 되어서 비어 있던 부분에다가 위 스크린샷에서 강조된 부분처럼, 일일히 txt파일에 대한 것을 입력해야 합니다. 여기서 입력하는 방법은 다음과 같습니다.


('프로젝트 내에서 txt파일의 경로',r '지금의 컴퓨터에서 txt파일이 존재하는 경로','text')


프로젝트 내에서 txt파일의 경로 : 만약 newTestAI라는 폴더안에 textfile이라는 폴더가 있으면, 다음과 같이 적어야만 합니다.

'textfile\파일명.txt'


그리고 지금의 컴퓨터에서 txt파일이 존재하는 경로 : 라는 것은 바로 이 컴퓨터상에서 존재하는 txt파일의 풀 경로입니다. 예를 들면 아래와 같은 형식이 됩니다.

'C:\Users\netpilgrim\PycharmProjects\newTestAI\textfile\파일명.txt'

위와 같은 형식으로 적어야 합니다.


이 외에도 제가 들은 바로는, 텍스트 문서만이 아니라, 음악파일과 같은 음원도 이런 식으로 만들 수 있다고 합니다.



다음으로는 RLTrader에서 기존에는 open()함수를 이용해서 그냥 텍스트 파일명만 입력을 하였습니다만, 이번에는 다르게 만들어서 resource_path()라는 사용자 정의 함수를 이용해서 경로를 구하라고 하고, 이후에야 open()함수를 이용해서 열도록 만들었습니다. 일단 지금 단계에서는 이 resource_path()라는 사용자 정의 메소드는 미완성이므로 아직은 올리지 않기로 했습니다.



그리고 RLTrader에서는 위 스크린샷과 같이 일단 임시로 PyCharm에서 실행을 위해서 텍스트 파일을 배치해 놓도록 만들어 주도록 합니다. 왜 이렇게 했느냐 하면, 먼저 RLTrader만으로 실행을 해서 코드에서 실행을 방해하는 것과 같은 오류가 없는지 알아보기 위함입니다.



이렇게 했는데도 실행이 되지 않아서, 이번에는 한번 txtfiles라는 폴더에다가 정보가 들어가 있는 txt파일들을 모아두는 방법으로 한번 바꾸어서 다시 실행을 시켜 보고자 합니다.



그런데 오류 메세지가 나오는 것을 보니까, 제가 의도하지도 않았는데, 왠 콤마(,)가 중간에 들어가 있어서 계속해서 경로를 찾지 못하고 에러를 일으키고 있는 것 이었습니다.



그래서 좀 전에는 공개하지 않은 resource_path()라는 사용자 정의 메소드에서 한줄을 더 추가하도록 했습니다. 바로 콤마가 들어간 부분을 ''라고 아무것도 없는-공백조차 없는 것으로 바꾸어 주도록 했습니다. 그리고 여기서 중요한 것이 있는데, 바로 sys._MEIPASS라는 것 입니다. 이 명령어는 바로 pyinstaller처럼 임시로 제공되는 폴더의 경로를 의미한다고 합니다.




이제서야 RLTrader 자체만을 PyCharm에서 작동시키는 것으로 어떻게 실행이 되는 것을 볼 수 있었습니다. 그런데 이번에는 main.py에서만 텍스트 파일을 여는 것이 아니라는 것을 생각해 보았습니다.



그렇게 해서 한번 agent.py를 체크해 보니까, 위 스크린샷처럼 txt파일을 여는 부분이 있어서, 이 부분을 main.py처럼 바꾸어 주어서 한번 해 보고자 합니다.



위 스크린샷은 agent.py에 만들어 놓은 resource_path()라는 메서드의 내용인데, 역시 여기서도 sys._MEIPASS라는 것을 이용해서, 임시로 만들어 여는 폴더가 있으면 이 경로를 base_path로 만들도록 하고, 아니라면 기존의 프로그램이 있는 경로를 지정 하도록 만들어 주는 것 입니다.



그런데 이번에는 콤마가 아니라 \\라는 것이 나와서 에러를 일으키는 것을 볼 수 있었습니다. 이게 처리하기 난감한게, replace()라는 함수를 이용해도 '\\'는 특별한 기호로 처리가 되기 때문에, 그냥은 처리를 할 수 없다는 문제점이 있었습니다. 



그래서 해결책이 무엇인가 했더니, 위 스크린샷처럼 pyinstaller를 이용해서 임시폴더가 있는 것이 아니라고 하면, '.'를 통해서 그냥 만들어 주기만 하면 되었습니다.



실제로 이번에는 에러없이 제대로 만들어 지는 것을 볼 수 있었습니다.




이제 pyinstaller를 이용해서 exe파일로 만드는 과정에 들어가 보도록 한 다음에, 한번 실험삼아서 pytrader에서 실행을 시킨 결과입니다. 여기서 당연하다면 당연하게도 제가 표식을 찍어놓은 경로가 001이니 002~007이라는 숫자 위에 있는 것을 보실 수가 있는데, 이 경로들이 바로 pyinstaller가 작동하면서 만들어 놓은 임시적인 폴더의 경로입니다. 즉, 지금까지 인식을 하지 못한 이유는 바로 pyinstaller로 만든 exe파일이 실행이 되면, 위 스크린샷처럼 임시로 열어놓은 폴더에서 있기 때문에, 기존에 PyCharm에서 있는 것처럼 경로를 지정할 경우 못 찾고 헤메이게 되는 것 입니다.



이번에야 말로 pytrader에서 실행시킨 RLTRader가 제대로 pytrader에 있는 buy_list.txt파일에다가 매수명령을 내리는 것을 볼 수 있었습니다.



그러나 모든일이 다 제대로 굴러가는 것이 아니라, 위 스크린샷처럼 python의 작동이 중지되었다면서 에러 메세지가 나오는 것을 보면서 프로그램이 딱 한번 자동으로 매수/매도 명령을 내리고 나서는 정지되어 버리는 것을 볼 수 있었습니다.



분명히 RLTrader에서 모든 코드가 다 작동하고 나서, 문제는 바로 그 직전에 buy_list.txt나 sell_list.txt를 여는 메서드가 시작되기 전에 중지가 되어 버리는 문제가 발생하는 것 이었습니다. 이번에도 어디가 문제인지 짐작이 가는 곳은 있지만, 거기를 처리하는 것이 정답인지 아닌지는 저도 모릅니다. 그래서 다음번 포스팅도 많이 늦어질 것이 아닌가 하는 생각이 듭니다.

반응형