안녕하세요?

 

지난번 포스팅에서 어덯게 spec파일을 이용해서 배포용으로 파이썬 프로그램을 만드는 방법에 대해서 정리해서 포스팅을 했지만, 정작 spec파일에서 무엇무엇을 설정해야 하는지에 대해서는 설명을 한다는 것을 빼먹었습니다. 일단 저도 모든 것을 다 알고있지는 못합니다. 그대신 제가 알아낸 것에 대해서는 최대한으로 자세하게 설명을 하고자 합니다.

 

먼저 알아두셔야 하는 것은 막 생성이 된 spec파일에서는 클래스라고 해야 할까요? 이게 무슨 언어로 씌여진 프로그램인지는 모르지만, 일단 4개의 클래스가 생성이 되는데, 먼저 생성이 되는 것은 Analysis라는 클래스를 먼저 보고 계십니다. 여기서는 먼저 가장 먼저 실행이 될 py파일을 지정해 주어야 합니다.

 

그리고 나서 3개의 클래스라고 할 수 있는 PYZ, EXE, COLLECT라는 3개의 함수가 있는 것을 확인할 수 있습니다. 저는 개인적으로 이 4개의 클래스가 각각 무슨 역할을 하는지 확실하게는 모릅니다. 다만 위 스크린샷에서 볼 수 있는 초록색 밑줄친 곳의 이름을 변경하면 실행파일인 exe가 붙은 파일명이 변경이 되고, 빨간색 밑줄을 친 부분의 이름을 변경하면, 한개의 폴더로 생성이 될 때 나오는 폴더명이 지정이 되게 됩니다.

 

만약에 위 스크린샷처럼 pyi-makespec을 이용할 때, 가운데에 --onefile이라고 해서 한개의 파일로만 만들어 지라는 옵션을 넣을 경우에는 어떻게 되느냐 하면......

 

이 경우에는 COLLECT라는 이름의 클래스가 없어지고, 대신 EXE클래스에 COLLECT에 있어야 할 변수들이 들어가 있는 것을 확인할 수 있었습니다.

 

 

그리고 사소하다면 사소하지만, 의외로 중요하다면 중요한 것이 하나 있는데, 바로 위 스크린샷에서 볼 수 있는 것처럼 붉은색 밑줄을 친 부분에서 아이콘을 지정할 수 있습니다. 단, 이 경우에는 프로젝트의 폴더 최상단에 ico로 된 파일이 있는 경우이고, 아니라면 ico파일의 위치를 일일히 지정해 주어야 합니다. 물론 이 때도 \U 가 유니코드 문제로 인식이 안되는 문제가 있기에 맨 앞에다가 r을 붙여 주어야 합니다.

 

그래서 이게 실제로 작동이 되는가 하면, 우선 이를 확인해 보기 위해서, 일단 money_smile.ico라는 이름의 아이콘 파일을 준비해 보도록 합니다. 이 아이콘 파일의 사이즈는 256 X 256 픽셀로 되어 있어야만 합니다.

 

이렇게 해서 위 스크린샷처럼 눈에 달러가 들어가 있는 모양의 아이콘이 생성이 된 것을 확인할 수 있었습니다. 다만 한개의 폴더로 생성이 되는 경우에는 안에 이러저러한 파일이 많아서 좀 복잡해 보이는게 단점이라면 단점이라고 할 수 있습니다.

 

다음으로 언급을 하고 넘어가야 하는 spec파일의 부분이라고 하면, 바로 이 console이라고 할 수 있는데, 이 부분은 cmd와 같은 실행창을 실행 시킬 것인지 아닌지를 결정합니다. 처음에는 별것 아닌 것이라고 생각했지만, 배포용으로 빌드를 하였을 경우에는 어떤 에러가 생길 지 모르기 때문에, 이에 대해서 한번 기억했다가 에러를 잡아내는데 사용하면 좋으리라 생각이 됩니다.

 

그리고 나서 공식적인 메뉴얼에 있는 내용인데, 이게 무엇이냐 하면, 배포용으로 빌드를 하기 위해서는 ui파일만이 아니라 소리나 그림파일 같은 모든 파일을 다 집어넣어야 합니다. 그런데 datas에 일일히 집어넣기 힘들어서, 위 스크린샷처럼 한개의 집합을 만들어서 한꺼번에 집어넣는 작업을 해줄 수 있습니다. 일단 넣어주는 방법은 프로젝트가 있는 폴더를 기준으로 해서, ('파일의 경로' , '빌드 이후 들어갈 폴더명') 이라는 식으로 지정이 가능합니다. 여기서 제일 중요한 것은, 파일을 일일히 지정하지 않고, 파일들이 있는 폴더만 경로에 사용한 경우, 폴더안에 있는 모든 파일이 다 빌드할 때 포함이 되게 됩니다.

 

그리고 나서 다음으로 중요한 것이 저와 같이 PyQt5를 사용하는 경우에 이렇게 ui파일만을 위한 공간을 따로 준비해야 합니다. 이 공간에서 역시나 주황색 밑줄처럼 ui파일의 이름을 지정해 주고, 파란색 밑줄처럼 ui파일이 있는 경로를 지정해 주는데, 역시나 \U가 인식이 잘못된느 문제로 인해서 맨 앞에다가 r을 붙여 주어야 했습니다. 마지막으로 빨간색 밑줄은 pyinstaller의 작업이 끝나고 나서 ui파일을 어디가 둘 것인지를 지정하는 것인데, 그냥 '.' 으로 하면 빌드한 프로젝트의 최상위 폴더에 위치를 하게 됩니다.

 

그리고 나서 한개의 파일로 지정을 해 주는 단계에서는 위 스크린샷과 같이 a.datas에 방금 지정해 놓은 일련의 내용들을 추가한다고 해 주어야 합니다.

 

다음으로 위 스크린샷을 보시면 binaries라는 항목이 있는 것을 볼 수 있습니다. 이게 무슨 역할을 하느냐 하면, 파이썬에서 C언어로 작성이 된 라이브러리 같은 것 - 대표적으로 jemalloc과 같은 메모리 누수를 잡아주는 라이브러리 같은 것이 있습니다. 그런데 이걸 왜 사용하느냐 하면, 아래와 같은 이유 때문입니다.

 

먼저 위 스크린샷과 같이 py파일과 직접적으로 관련이 있는 C언어로 작성된 라이브러리 파일인 so파일같은 것은 메인이 되는 프로그램인 pyinstaller가 잡아서 번들로 만들어 줍니다. 그런데 so파일이 관련이 있는 dylib이 있다면, 이건 자동으로 잡아주지 못해서 나중에 에러를 일으키는 원인이 되게 됩니다. 이를 방지하기 위해서 binaries= 라는 항목에다가 이렇게 자동으로 인식하지 못하는 C언어 라이브러리들을 포함시켜 주어야 합니다.

 

이것으로 제가 아는 범위에서 일단 정리는 끝났습니다. 물론 이건 극히 일부이고, 아직 제 자신도 실습을 해봐서 익혀야 하는 것이 많이 있습니다. 그래도 중구난방으로 된 실험노트 보다는 좀 더 정리된 내용을 보시고 도움을 얻으셨으면 합니다.

+ Recent posts