ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PyInstaller -i, --add-data로 아이콘(icon)을 포함하자
    Python/이것저것 파이썬 2021. 12. 4. 12:36
    반응형

    [참고] tistory 코드의 가독성을 높이는 법

     

    소스와 아이콘이 같은 폴더에 있을 때,
    tkinter를 이용한 코드입니다.

    import os
    
    if os.path.isfile('foo.ico'):
        self.root.iconbitmap('foo.ico')

    코드를 실행하면,
    정상적으로 아이콘을 볼 수 있지만

    파이 인스톨러로 만든 실행파일을 실행하면,
    아이콘 대신 나뭇잎만 보입니다. :<  

    onefile 옵션을 사용하지 않았을 때는
    ico 파일을 새로 만들어진 폴더에 따로 복사하면
    아이콘을 볼 수 있습니다. 

    하지만, --onefile 옵션을 사용할 때는, 
    (따로 복사할 수 없기 때문에)
    실행 파일아이콘 파일을 포함해야 합니다. 

     

    '--onefile'은,
    실행에 필요한 파일과 폴더를 모아
    하나의 '자동 실행 압축 파일'을
    만드는 옵션입니다. 

    이 자동 실행 압축 파일을 실행하면
    임시 폴더에 압축을 푼 뒤
    폴더 내 실행파일을 실행합니다.

    이 임시 폴더의 위치가
    고정되어 있지 않기 때문에
    아이콘 파일을 복사하기 힘듭니다.  

     

    빌드 시 --add-data 옵션을 이용하여
    "<포함할_파일;저장될_위치>"를 설정해 두면 
    실행 파일에 아이콘 파일을 포함할 수 있습니다. 

    Mac OS에서는 ";" 대신 ":"을 사용해야 합니다. 

    --add-data는 여러 번 사용할 수 있습니다.

    자세한 것은 원문 링크를 참고하세요. 
    https://pyinstaller.org/en/stable/usage.html#cmdoption-add-data

    .\venv\Scripts\pyinstaller --onefile -w -i=foo.ico --add-data="foo.ico;." foo.py

    소스 파일과 같은 위치에
    아이콘 파일이 있는 상황이라
    '.'으로 설정했습니다. 

    -i 옵션의 아이콘
    탐색기에서 보이는
    exe 파일의 아이콘입니다.
    gui 좌측 상단의 아이콘이 아닙니다.

    압축 해제된 폴더에서 
    실행파일이 실행되기 때문에
    아이콘 파일의 위치를
    정확하게 찾을 수 있도록 
    소스코드도 수정합니다. 

    import os
    
    path = os.path.join(os.path.dirname(__file__), 'foo.ico')
    if os.path.isfile(path):
        self.root.iconbitmap(path)

     

    '__file__'은 현재 실행중인 파이썬 파일의 전체 경로를 의미합니다. 
    os.path.dirname()는 전체 경로 중 파일명을 제거합니다. 
    os.path.join()은 경로와 문자열(파일명)을 결합합니다. 

    from os import path
    
    print(__file__)  # C:\PyProjects\test\test.py
    print(path.dirname(__file__))  # C:\PyProjects\test
    print(path.join(path.dirname(__file__), 'foo.ico'))  # C:\PyProjects\test\foo.ico

     

    PS) 요즘 nuitka도 핫하다는데.... 
    https://nuitka.net/

    반응형
Designed by Tistory.