이미지 또는 사운드와 같은 추가 데이터 파일 추가 및 자체 연구 / 테스트에 대한 Max 및 This post 의 훌륭한 답변을 사용하여 이러한 파일을 추가하는 가장 쉬운 방법이 무엇인지 알아 냈습니다.
당신이 살아있는 예제를보고 싶은 경우, 저장소 (repository)는 여기 GitHub의에.
참고 : 이것은 pyinstaller와 함께 --onefile
또는 -F
명령을 사용하여 컴파일하기위한 것입니다.
내 환경은 다음과 같습니다.
- 파이썬 3.3.7
- Tkinter 8.6 (버전 확인)
- Pyinstaller 3.6
2 단계로 문제 해결
이 문제를 해결하려면 Pyinstaller에 응용 프로그램과 함께 "번들"되어야하는 추가 파일이 있음을 구체적으로 알려야합니다.
또한 '상대적'경로 를 사용해야 하므로 애플리케이션이 Python 스크립트 또는 고정 EXE로 실행될 때 제대로 실행될 수 있습니다.
우리는 상대 경로를 가질 수있는 함수가 필요합니다. Max Posted 함수를 사용하면 상대 경로를 쉽게 해결할 수 있습니다.
def img_resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
위의 함수를 이와 같이 사용하여 앱이 스크립트 또는 고정 EXE로 실행될 때 애플리케이션 아이콘이 표시되도록합니다.
icon_path = img_resource_path("app/img/app_icon.ico")
root.wm_iconbitmap(icon_path)
다음 단계는 컴파일 할 때 추가 파일을 찾을 위치를 Pyinstaller에 지시하여 응용 프로그램이 실행될 때 임시 디렉토리에 생성되도록하는 것입니다.
문서에 표시된 대로이 문제를 두 가지 방법으로 해결할 수 있지만 개인적으로 .spec 파일을 관리하는 것을 선호하므로 그렇게 할 것입니다.
먼저 .spec 파일이 있어야합니다. 제 경우에는 pyinstaller
추가 인수 로 실행 하여 필요한 것을 만들 수 있었으며 여기에서 추가 인수를 찾을 수 있습니다 . 이 때문에 내 사양 파일이 귀하의 것과 약간 다를 수 있지만 중요한 부분을 설명하고 참조 용으로 모두 게시합니다.
added_files는 기본적으로 튜플의, 내 경우에는 내가 단 하나의 이미지를 추가 꿔 포함하는 목록입니다,하지만 당신은 사용의 또는 JPG의를 PNG, 여러 ICO의 추가 할 수 있습니다('app/img/*.ico', 'app/img')
과 같이 또 다른 튜플을 만들 수 있습니다 당신을added_files = [ (), (), ()]
여러 수입을 가지고
튜플의 첫 번째 부분은 추가 할 파일 또는 파일 유형과 파일 을 찾을 위치를 정의합니다. 이것을 CTRL + C로 생각하십시오.
튜플의 두 번째 부분은 Pyinstaller에게 'app / img /'경로를 만들고 .exe를 실행할 때 생성되는 임시 디렉터리에 상대적인 해당 디렉터리에 파일을 배치하도록 지시합니다. 이것을 CTRL + V로 생각하십시오.
에서a = Analysis([main...
datas=added_files
원래는를 설정datas=[]
했지만 가져 오기 목록을 가져 오기를 원하므로 사용자 정의 가져 오기를 전달합니다.
EXE에 대한 특정 아이콘을 원하지 않는 한이 작업을 수행 할 필요가 없습니다. 스펙 파일 하단에서 Pyinstaller에게 exe에 대한 내 애플리케이션 아이콘을 옵션으로 설정하도록 지시합니다 icon='app\\img\\app_icon.ico'
.
added_files = [
('app/img/app_icon.ico','app/img/')
]
a = Analysis(['main.py'],
pathex=['D:\\Github Repos\\Processes-Killer\\Process Killer'],
binaries=[],
datas=added_files,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='Process Killer',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True , uac_admin=True, icon='app\\img\\app_icon.ico')
EXE로 컴파일
나는 매우 게으르다. 나는 내가해야하는 것보다 더 많은 것을 입력하는 것을 좋아하지 않는다. 클릭하기 만하면되는 .bat 파일을 만들었습니다. 이 작업을 수행 할 필요는 없습니다.이 코드는 명령 프롬프트 셸에서 실행됩니다.
.spec 파일에는 모든 컴파일 설정 및 인수 (일명 옵션)가 포함되어 있으므로 해당 .spec 파일을 Pyinstaller에 제공하면됩니다.
pyinstaller.exe "Process Killer.spec"
a.datas += ...
)이 정말 도움이되었습니다. pyinstaller 문서는 사용에 대해 이야기COLLECT
하지만 사용할 때 파일을 바이너리에 넣지 못합니다--onefile