파이썬 실행 파일 생성 - pyinstaller

파이썬 코드를 하나의 실행파일로 만들어 사용하려면 pyinstaller 모듈을 설치해야 한다.

$ pip install pyinstaller

pyinstaller는 다양한 옵션을 제공하고 있으며, 자주 사용하는 옵션은 아래와 같다.

  • --onefile (-F)
    • 단일 실행 파일로 생성
  • --noconsole
    • 윈도우 & 맥OS에서 콘솔창 출력 없이 실행
  • --distpath <DIR>
    • 최종 생성 파일 경로 지정
  • --workdpath <DIR>
    • 임시 작업 파일 경로 지정
  • --path <DIR>
    • 파이썬 코드에서 참조하는 모듈 경로 지정
  • add-data
    • 실행에 필요한 non-binary 파일 지정
    • 단일 실행 파일로 생성할 경우 실행 파일에 포함시킴
    • 윈도우는 key, value를 세미콜론(;)로 구분하며, 유닉스 계열의 시스템은 콜론(:)으로 구분
      ex) --add-data "j1939.png;."
  • add-binary
    • add-data와 동일한 기능이며, binary 파일을 지정
  • --icon <ico file>
    • 윈도우 실행 파일의 아이콘 지정

위 옵션을 바탕으로 pyinstaller를 사용하여 단일 실행 파일 생성하기 아래와 같은 명령어 구성을 만들 수 있다.

$ pyinstaller --name J1939 -F j1939.py --distpath output/dist --workpath output/build --noconsole --add-binary "j1939.png;."

위 명령어를 실행하였을 때, 아래 이미지와 같은 '시스템 파일에 접근할 수 없습니다' 에러가 발생할 수 있다.

위 문제는 pip로 설치한 모듈과 파이썬 버전이 맞지 않아 발생한 문제이기 때문에 파이썬과 모듈을 버전에 맞게 다시 설치해야 한다.

 

참고로, 위 명령어에서 png 파일을 포함하여 아이콘으로 설정할 경우, 아이콘 파일인 png 파일이 실행파일에 포함되므로, 실행시 이것을 tmp 디렉토리에 풀어서 이미지를 로딩하기 때문에 이미지 경로를 아래 코드와 같이 수정해야 한다.

        try:
            # sys.MEIPASS is temp directory for pyinstaller
            icon_path = os.path.join(getattr(sys, '_MEIPASS'), "j1939.png")
        except:
            icon_path = os.path.join(os.path.abspath("."), "j1939.png")
        self.__root.iconphoto(True, tkinter.PhotoImage(file=icon_path))
...