2012-01-15 8 views
8

के साथ छवियों और कुछ कॉन्फ़िगरेशन फ़ाइलों को बनाएं, मुझे पाइथन प्रोग्राम में छवियों और txts जैसी कुछ डेटा फ़ाइलों को जोड़ने के दौरान pyinstaller के साथ कोई समस्या है। उदाहरण के लिए, मैंने आइकन के साथ टूलबार बनाया है, और मैं उन्हें छवियों के एक अलग फ़ोल्डर में संग्रहीत करता हूं। इसके अलावा मेरे पास कुछ कॉन्फ़िगरेशन स्टोर करने के लिए कुछ txt और xml फ़ाइलें हैं। ये txt चींटी xml फ़ाइलों को data_files नामक किसी अन्य फ़ोल्डर में संग्रहीत किया जाता है। सभी पीई फाइलों को स्रोत नाम के दूसरे फ़ोल्डर में संग्रहीत किया जाता है।छवियों और कुछ कॉन्फ़िगरेशन फ़ाइलों जैसे कि txtinstaller

जब मैं pyinstaller के साथ इस पायथन प्रोग्राम को बनाने का प्रयास कर रहा हूं, pyinstaller सफलतापूर्वक सभी स्रोत फ़ोल्डर का निर्माण कर सकता है, लेकिन छवियों और डेटा_फाइल फ़ोल्डरों का निर्माण नहीं किया जा सकता है। मैंने pyinstaller के प्रलेखन की जांच की लेकिन मुझे कोई समाधान नहीं मिला। मैंने बहुत सारी Google खोज की हैं और केवल this सहायक के रूप में रिसोर्स पाई हैं, लेकिन यह एक बहुत ही अपर्याप्त संसाधन है।

मेरा मुख्य प्रश्न यह है: मैं एक अलग फ़ाइल के साथ एक exe फ़ाइल कैसे बना सकता हूं जैसे छवियों और pyinstaller का उपयोग करके confs?

संपादित करें: मुझे समाधान मिला। जब आप spec फ़ाइल बनाते हैं तो आपको a.datas पैरामीटर होना चाहिए।

# -*- mode: python -*- 
a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), '/home/vmode/Desktop/derlem2/sources/TextSTAT.py'], 
      pathex=['/home/pyinstaller']) 
a.datas += [("Images/New.gif","/home/vmode/Desktop/derlem2/Images/New.gif","DATA")] 
a.datas += [("Images/Open.gif","/home/vmode/Desktop/derlem2/Images/Open.gif","DATA")] 
a.datas += [("Images/Column.gif","/home/vmode/Desktop/derlem2/Images/Column.gif","DATA")] 
pyz = PYZ(a.pure) 
exe = EXE(pyz, 
      a.scripts, 
      a.binaries, 
      a.zipfiles, 
      a.datas, 
      name=os.path.join('dist', 'TextSTAT'), 
      debug=False, 
      strip=False, 
      upx=True, 
      console=1) 

उपर्युक्त स्पेक कोड मेरी परियोजना के लिए डिज़ाइन किया गया है। जैसा कि इस स्पेस कोड में देखा गया है, मैंने पायथन प्रोग्राम के साथ निर्माण करने के लिए 3 आइकन शामिल किए हैं। जब प्रोग्राम उत्पन्न होता है तो इन आइकनों को एम्बेड किए गए एक स्टैंडअलोन निष्पादन योग्य फ़ाइल होती है।

लेकिन अगर हमारे पास इतनी सारी फाइलें हैं तो क्या होगा? मान लीजिए कि हमारे कार्यक्रम में उपयोग करने के लिए हमारे पास 1000 आइकन हैं। हाथ से spec फ़ाइल को लिखना बहुत अपर्याप्त है। फ़ाइल निर्देशिका को पढ़ने और इन फ़ाइलों को गतिशील रूप से जोड़ने के लिए एक लूप सिस्टम होना चाहिए। लेकिन मुझे नहीं पता कि इन फ़ाइलों को गतिशील रूप से कैसे जोड़ा जाए। मुझे लगता है कि हाथ से इन इतनी सारी फाइलें जोड़ने का कोई मौका नहीं है। यदि कोई जानता है, तो कृपया साझा करे।

+0

उपयोग कर सकते हैं 'प्रयास करें cx_freeze'। मैंने 'py2exe', 'pyinstaller', कुछ अन्य यादृच्छिक प्रोग्राम की कोशिश की, और केवल' cx_freeze' ने मेरे लिए काम किया (मैंने PyQt4 का उपयोग किया)। यदि आप बाइनरी बनाने के लिए अपना कोड देखना चाहते हैं, तो यह गिटहब पर है: https://github.com/blender3D/Bindery/blob/master/tools/binary.py – Blender

+0

आपकी रुचि के लिए धन्यवाद। लेकिन cx_freeze केवल .exe फ़ाइल बनाता है। मैं प्रोग्राम को सभी प्लेटफ़ॉर्म बनाने के लिए तैयार करना चाहता हूं। तो मुझे pyinstaller का उपयोग करना है। लेकिन कुछ बड़े ट्यूबल हैं। – user1150508

+0

नहीं, 'cx_freeze' लिनक्स के लिए भी बाइनरी बनाता है। मैक को Py2app की आवश्यकता है। – Blender

उत्तर

5

मेरे निष्पादन योग्य बनाने में, मैं इस समस्या को भी पार कर गया। क्योंकि .spec फ़ाइल पायथन का उपयोग कर रही है, ग्लोब मॉड्यूल मेरा समाधान था।

imagesList = [] 
imagesList.append(('icon.ico', '..\\pathfinder\\icon.ico', 'DATA')) 
import glob 
allImages = glob.glob('..\\pathfinder\\*.png') 
for eachImage in allImages: 
    imageParts = eachImage.split('\\') 
    imagesList.append((imageParts[-1], eachImage, 'DATA')) 
print imagesList 
a.datas += imagesList 

icon.ico के बारे में रेखा 2 अलग था क्योंकि इसमें एक अलग फ़ाइल एक्सटेंशन था, और इस प्रकार इसे बाहर रखा जा सकता है। '.. \ pathfinder' मेरे सभी प्रोग्राम की फ़ाइलों के लिए पथ है (pyinstaller निर्देशिका से संबंधित)। glob सभी .png फ़ाइलों के लिए निर्देशिका की खोज करता है (मेरे पास 65 है और उन्हें हाथ से लिखने से इनकार कर दिया है) और स्ट्रिंग्स, पूर्ण रिश्तेदार निर्देशिका को बरकरार रखने के रूप में उनकी एक सूची देता है। इसे फ़ाइल नामों की सूची में अलग करने के लिए, मैंने बैकस्लैश पर string.split() का उपयोग किया। फिर प्रत्येक के लिए, उपयोगकर्ता द्वारा बनाई गई सूची में स्ट्रिंग स्प्लिट के अंतिम भाग का एक टुपल जोड़ें (जो केवल छवि का फ़ाइल नाम होने वाला होगा) और पूर्ण पथनाम। अंत में, सभी फ़ाइलों की एक सूची के साथ, इसे a.datas में जोड़ें।

मैंने कमांड लाइन के माध्यम से पुष्टि की है कि यह वास्तव में सही तरीके से काम करता है, और आप किसी भी अतिरिक्त फ़ाइल एक्सटेंशन के लिए लूप को दोबारा कॉपी कर सकते हैं।

दुर्भाग्य से, हालांकि यह फ़ाइल नामों को सही ढंग से खींचने और संलग्न करने के लिए प्रतीत होता है, फिर भी मेरे निष्पादन योग्य फ़ाइलों के साथ अभी भी प्रतीत नहीं होता है (या निष्पादन योग्य फ़ाइलों को अपने डेटा में नहीं मिल सकता है) और मुझे अभी भी होना है काम करने के लिए एक ही निर्देशिका में कच्ची छवियां; शायद मेरे पास गलत तरीके से आदेश दिए गए टुपल के तत्व हैं (और इस प्रकार, यदि ऐसा है, तो आपको तदनुसार अपना कोड समायोजित करना चाहिए)। उम्मीद है कि, यह गतिशील भार अभी भी आपके लिए काम करेगा, हालांकि। imageParts [-1] प्रत्येक .png के फ़ाइल नाम का प्रतिनिधित्व करता है, और प्रत्येक छवि अपने पूर्ण पथ का प्रतिनिधित्व करती है (या सापेक्ष पथ यदि ग्लोब में उपयोग किया गया था)।

1

सभी छवियों को एक ही निर्देशिका के अंतर्गत सूचीबद्ध हैं, तो आप ट्री

dict_tree = Tree('/home/vmode/Desktop/derlem2/Images', prefix = 'Images') 
a.datas += dict_tree 
संबंधित मुद्दे