मैक्स और इस पोस्ट के उत्कृष्ट उत्तर का उपयोग करके छवियों या ध्वनि और मेरे स्वयं के अनुसंधान / परीक्षण जैसी अतिरिक्त डेटा फ़ाइलों को जोड़ने के बारे में, मुझे लगा है कि मेरा मानना है कि ऐसी फ़ाइलों को जोड़ने का सबसे आसान तरीका है।
आप एक जीवित उदाहरण देखने के लिए चाहते हैं, तो मेरी भंडार है यहाँ GitHub पर।
नोट: यह pyinstaller के साथ --onefile
या -F
कमांड का उपयोग करने के लिए संकलित करने के लिए है ।
मेरा वातावरण इस प्रकार है।
समस्या को 2 चरणों में हल करना
समस्या को हल करने के लिए हमें विशेष रूप से Pyinstaller को बताने की ज़रूरत है कि हमारे पास अतिरिक्त फ़ाइलें हैं जिन्हें एप्लिकेशन के साथ "बंडल" करने की आवश्यकता है।
हमें एक 'सापेक्ष' पथ का उपयोग करने की भी आवश्यकता है , इसलिए जब यह पायथन स्क्रिप्ट या फ्रोजन EXE के रूप में चल रहा हो तो एप्लिकेशन ठीक से चल सकता है।
उस कहा जा रहा है के साथ हम एक समारोह है कि हमें रिश्तेदार रास्ते की अनुमति देता है की जरूरत है। मैक्स पोस्ट किए गए फ़ंक्शन का उपयोग करके हम आसानी से रिश्तेदार पथ को हल कर सकते हैं।
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
अतिरिक्त आर्ग के साथ दौड़कर जो कुछ भी आवश्यक था, उसे बनाने में सक्षम था , आप यहां अतिरिक्त आर्ग पा सकते हैं । इस वजह से, मेरी युक्ति फ़ाइल आपकी तुलना में थोड़ी अलग दिख सकती है, लेकिन महत्वपूर्ण बिट्स की व्याख्या करने के बाद मैं इसे संदर्भ के लिए पोस्ट कर रहा हूं।
जोड़ा_फाइल्स अनिवार्य रूप से एक सूची है, जिसमें टपल की भूमिका है, मेरे मामले में मैं केवल एक SINGLE छवि जोड़ना चाहता हूं, लेकिन आप कई ico जोड़ सकते हैं, png या jpg का उपयोग कर('app/img/*.ico', 'app/img')
सकते हैं आप एक और tuple भी बना सकते हैं जैसेadded_files = [ (), (), ()]
कि कई आयात करना
टपल का पहला भाग यह निर्धारित करता है कि आप किस फ़ाइल या किस प्रकार की फ़ाइल को जोड़ना चाहते हैं और साथ ही साथ उन्हें कहाँ खोजें। इसे CTRL + C के रूप में सोचें
Tuple का दूसरा भाग Pyinstaller को बताता है, पथ 'ऐप / img /' बनाने के लिए और उस निर्देशिका में फ़ाइलों को उस स्थान पर रखें जहाँ जो भी अस्थायी निर्देशिका बनती है, जब आप .exe चलाते हैं। इसे CTRL + V के रूप में सोचें
के तहतa = Analysis([main...
, मैंने सेट किया हैdatas=added_files
, मूल रूप से यह हुआ करता था,datas=[]
लेकिन हम चाहते हैं कि आयात की सूची अच्छी तरह से आयात की जाए, इसलिए हम अपने कस्टम आयात में पास होते हैं।
जब तक आप EXE के लिए विशिष्ट आइकन नहीं चाहते हैं, तब तक आपको ऐसा करने की आवश्यकता नहीं है, जिस फ़ाइल के विकल्प के साथ मैं exe के लिए अपने एप्लिकेशन आइकन को सेट करने के लिए Pyinstaller को बता रहा हूं 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 फ़ाइल में हमारी सभी संकलन सेटिंग और args (उर्फ विकल्प) शामिल हैं, इसलिए हमें केवल .spec फ़ाइल को Pyinstaller को देना होगा।
pyinstaller.exe "Process Killer.spec"
a.datas += ...
) वास्तव में अभी मेरी मदद की। pyinstaller प्रलेखन का उपयोग करने के बारे में बात करता है,COLLECT
लेकिन उपयोग करते समय बाइनरी में फाइल डालने में विफल रहता है--onefile