개발

[개발일지] 파이썬으로 실행파일(exe) 파일을 만들어 보았다

Aireee 2022. 3. 11. 11:55
300x250
반응형

인도네시아와, 국내 관광지 및 휴양지를 여행하는 삶에서, 다시 컴퓨터 속 코드를 탐험하고 여행하는 삶을 살아하고 있는 여행자로서 하루하루의 삶을 매일 기록하며 사는 블로거나 유튜버는 아니지만, 그래도 가끔은 내가 무엇을 경험하고, 무엇을 배웠는지를 기록으로 남기고 싶을 때가 있다. 그 옛날, 다음카페의 대문과 제목줄을 꾸미기 위해 html 코드를 배우다가, 홈페이지, 메일 매거진등을 발행하면서 결국엔 PHP를 이용하여 홈페이지를 만드는 삶이 어느 순간 인도네시아어를 사용하는 삶을 거쳐 파이썬(PYTHON)이라는 언어를 사용해 업무효율을 끌어올리는 삶을 살아가면서 지금까지는 그저, 콘솔창에 직접소스를 실행시키고, 오류가 생기면 계속해서 조금씩 수정하고 있었다. 사실 구지 프로그램을 exe 파일로 만들 필요가 없었다. 

그런데!! 이슈가 생기기 시작했다. 그 동안은 한대의 컴퓨터로도 충분했던 작업들이 이제는 어려워지기 시작한 것. 이제는 exe 파일을 만들어야 하는 상황이 생긴 것이다. 그래서 공부를 해 보았다. 

이 기록은 2022년 3월 10일의 경험이다.

파이썬파일 (*.py) 을 *.exe 파일로 만드는 도구는 단 한가지가 아닌 몇가지가 존재한다. 하지만, 본인은 단 하나만 사용해보았고, 충분히 만족스러웠기에... 이방식에 1차적으로 정착하려고 한다. 바로 pyinstaller 이다.

1. 설치

역시나 매우 간단한 설치 방법. cmd 나 powershell 같은 콘솔창에서 다음과 같이 입력하기만 하면 끝!

C:/> pip install pyinstaller

 

2. 기본 사용방법

사용도 사실 매우 간단하다. 우선 내가 코딩한 파일이 있는 폴더로 이동한다. 그리고 다음과 같이 입력한다. 여기서 파일명은 app.py 라고 가정하자

C:/myproject> pyinstaller app.py

이렇게 실행하는 경우 자동으로 build 와 dist 폴더 및 몇몇파일이 생성되는데 dist 폴더 밑에 myproject 폴더 아래 app.exe 파일이 생성된다. 파일을 더블클릭하면 바로 실행된다. 그리고 해당폴더안의 모든 파일을 복사해서 다른컴퓨터로 옮기면 복제가 되고, 다른 컴퓨터에서 사용이 가능하다는 사실. 이 경우, 파일이 옮겨질 타인의 컴퓨터에 python 이 설치되어 있지 않아도 된다는 것. 

그런데, 파일이 너무 많으면 불편하다. pyinstaller 는 프로그램을 단 하나의 exe 파일로 만들 수 있다. 다음과 같이 하면 된다. 이번에도 파일명은 app.py 이다.

C:/myproject> pyinstaller -F app.py

이렇게 할 경우 하나의 파일로 압축되어 생성된다. 단 이경우 프로그램 실행이 조금 느려질 수도 있다고 한다. 무엇보다도, 하나의 파일로 만드는 경우 "관리자 모드" 실행이 안된다는 말이 있었다. 문제는 내가 코딩한 프로그램이 관리자모드를 이용해야 한다는 것이다. 마우스 클릭을 자동으로 하는 오토마우스, 매크로 장르의 프로그램이기 때문이다. 

그래서 아래와 같이 처리했다. 이렇게 하면, 프로그램이 관리자 모드로 실행된다고 한다.

c:/myproject> pyinstaller --uac-admin app.py

여러개의 파일이 생성되었다. dist 아래의 폴더에 들어가 프로그램을 실행하니 프로그램이 돌아가기 시작했다!

그런데, 내가 만든 프로그램은 기존에 만들어놓은 폴더 아래의 파일을 특정 사이트에 입력하는 방식이었기 때문에 파일들이 필요했다. 그리고 업로드를 위해 엑셀문서를 참조하게 만들어 두었다는 점이다. 

그래서, exe 파일이 있는 폴더 안에 필요한 자료를 복사해서 실행하니 문제가 없었다. 
물론 하나의 문제가 또 발생하기는 했다. 

프로그램 내부에 파일업로드를 위한 경로를 설정해둔 부분이 있는데 그 부분이 기본 개발용 컴퓨터에 맞춰저 있던터라, 추가로 수정을 해줄 수 밖에 없었다. 

귀찮아서 물리적으로 주소를 기입해 놨었는데 그 부분을 os 를 이용해 처리하기로 했다.

path = os.getcwd()


확실히 주소를 물리적으로 사용하는 건 좀 아닌듯 싶다. 이렇게 또 하나하나 배우는 것... 문제는 습관을 이렇게 들여야 하는데, 그동안은 그렇게 하지 않아서 뻘짓을 했다는 느낌.. 작동하는데 문제가 없으니 무시하고 살았다. 분명 위 코드를 부분부분 사용하기는 했는데, 모든 부분에 적용하지 않았었다. 역시 사람은 오류를 만나야 깨닫는 것이 있는 것 같다. 

하지만, 문제는 여기서 끝이 아니었다. 만들고 있는 프로그램은 위에도 잠깐 설명했듯이 매크로인데, 특정 위치에 특정한 파일들을 업로드 해주는 것이었기 때문이다. 이 업로드를 할 때, 모든 파일을 업로드 하는 것은 아니라는 것. 조건에 부합하지 않는 파일은 업로드가 안되는데, 기존에는 커맨드 창에서 돌렸기 때문에 print 를 이용한 확인이 가능했지만, 이번에는 확인이 불가능했다. 

이 부분을 현재는 처리하지 않았다. 하지만 방법은 생각해두긴 했다. 

1. 업로드된 파일은 삭제하여 없앤다. 

2. 업로드된 파일 또는 문제가 있는 파일을 다른 폴더를 만들어서 이동시켜둔다. 

이 두가지 중 하나를 이용하면 된다. 다만 1번의 방법보다는 2번의 방법이 더 좋을 듯 싶다. 파일이라는 건 이미 처리된 것이라고 해도 프로그램이 함부로 지워버리는 건 바람직하지 않을 수 있으니까. 이와 관련한 처리는 아직 하지 않았다. 아마도 안할지도 모르겠다. 이제 용도가 끝났기 때문이다. 물론, 비슷한 방식으로 추가 프로그램을 짜기는 해야 하긴 하지만, 일단은 그렇다. 

 

 

반응형