Sử dụng câu trả lời tuyệt vời từ Max và Bài đăng này về việc thêm các tệp dữ liệu bổ sung như hình ảnh hoặc âm thanh và nghiên cứu / thử nghiệm của riêng tôi, tôi đã tìm ra cách tôi tin là cách dễ nhất để thêm các tệp như vậy.
Nếu bạn muốn xem một ví dụ trực tiếp, kho lưu trữ của tôi ở đây trên GitHub.
Lưu ý: đây là để biên dịch bằng lệnh --onefile
hoặc -F
với pyinstaller.
Môi trường của tôi như sau.
Giải quyết vấn đề trong 2 bước
Để giải quyết vấn đề, chúng tôi cần thông báo cụ thể với Pyinstaller rằng chúng tôi có các tệp bổ sung cần được "đóng gói" với ứng dụng.
Chúng tôi cũng cần sử dụng một đường dẫn 'tương đối' để ứng dụng có thể chạy đúng cách khi nó đang chạy dưới dạng Python Script hoặc Frozen EXE.
Như đã nói, chúng ta cần một hàm cho phép chúng ta có các đường dẫn tương đối. Sử dụng chức năng mà Max Posted chúng ta có thể dễ dàng giải quyết vấn đề tương đối.
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)
Chúng tôi sẽ sử dụng chức năng trên như thế này để biểu tượng ứng dụng hiển thị khi ứng dụng đang chạy dưới dạng Script HOẶC Frozen EXE.
icon_path = img_resource_path("app/img/app_icon.ico")
root.wm_iconbitmap(icon_path)
Bước tiếp theo là chúng ta cần hướng dẫn Pyinstaller nơi tìm các tệp bổ sung khi nó đang biên dịch để khi ứng dụng được chạy, chúng sẽ được tạo trong thư mục tạm thời.
Chúng tôi có thể giải quyết vấn đề này theo hai cách như được hiển thị trong tài liệu , nhưng cá nhân tôi thích quản lý tệp .spec của riêng mình, vì vậy đó là cách chúng tôi sẽ thực hiện.
Đầu tiên, bạn phải có tệp .spec. Trong trường hợp của tôi, tôi đã có thể tạo ra những gì tôi cần bằng cách chạy pyinstaller
với các args bổ sung, bạn có thể tìm thêm args tại đây . Vì điều này, tệp thông số kỹ thuật của tôi có thể hơi khác so với tệp của bạn nhưng tôi sẽ đăng tất cả để tham khảo sau khi tôi giải thích các điểm quan trọng.
added_files về cơ bản là một Danh sách chứa Tuple, trong trường hợp của tôi, tôi chỉ muốn thêm một hình ảnh DUY NHẤT, nhưng bạn có thể thêm nhiều ico, png hoặc jpg bằng cách sử dụng.('app/img/*.ico', 'app/img')
Bạn cũng có thể tạo một bộ khác như vậyadded_files = [ (), (), ()]
để có nhiều lần nhập
Phần đầu tiên của bộ tuple xác định tệp nào hoặc loại tệp nào bạn muốn thêm cũng như nơi tìm chúng. Hãy coi đây là CTRL + C
Phần thứ hai của tuple nói với Pyinstaller, tạo đường dẫn 'app / img /' và đặt các tệp trong thư mục đó LIÊN QUAN đến bất kỳ thư mục tạm thời nào được tạo khi bạn chạy .exe. Hãy coi đây là CTRL + V
Dưới đâya = Analysis([main...
, tôi đã đặtdatas=added_files
, ban đầu nó đã từng như vậydatas=[]
nhưng chúng tôi muốn đưa ra danh sách các nhập khẩu, tốt, được nhập khẩu để chúng tôi chuyển các nhập khẩu tùy chỉnh của mình.
Bạn không cần phải làm điều này trừ khi bạn muốn có một biểu tượng cụ thể cho EXE, ở cuối tệp thông số kỹ thuật, tôi yêu cầu Pyinstaller đặt biểu tượng ứng dụng của tôi cho exe với tùy chọn 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')
Biên dịch sang EXE
Tôi rất lười; Tôi không thích gõ nhiều thứ hơn tôi phải làm. Tôi đã tạo một tệp .bat mà tôi có thể nhấp vào. Bạn không cần phải làm điều này, mã này sẽ chạy trong một trình bao dấu nhắc lệnh mà không cần nó.
Vì tệp .spec chứa tất cả cài đặt biên dịch & args (hay còn gọi là tùy chọn) của chúng tôi, chúng tôi chỉ cần cung cấp tệp .spec đó cho Pyinstaller.
pyinstaller.exe "Process Killer.spec"
a.datas += ...
) thực sự đã giúp tôi vừa rồi. các cuộc đàm phán tài liệu PyInstaller về việc sử dụngCOLLECT
nhưng điều đó không đưa file vào nhị phân khi sử dụng--onefile