py2exe - एकल निष्पादन योग्य फ़ाइल उत्पन्न करता है


141

मुझे लगा कि मैंने सुना है कि py2exe ऐसा करने में सक्षम था, लेकिन मैंने कभी भी इसका पता नहीं लगाया। क्या किसी ने सफलतापूर्वक ऐसा किया है? क्या मैं आपकी setup.py फ़ाइल, और किस कमांड लाइन विकल्प का उपयोग कर सकता हूँ?

मूल रूप से मैं इसके बारे में सोच रहा हूं जो मुझे एक एकल निष्पादन योग्य फ़ाइल दे रहा है जो कि शायद कुछ ही समय के लिए खुद को अनपिप करता है / चलाता है और चलाता है।


क्या यह पायथन 3 पर लागू होता है, या अजगर 2 के बाद संस्करण?
विंसेंट

जवाबों:


105

PyInstaller कोई एकल .exe फ़ाइल बनाएगा जिसमें कोई निर्भरता नहीं है; --onefileविकल्प का उपयोग करें । यह सभी आवश्यक साझा किए गए कामों को निष्पादन योग्य में पैक करके करता है, और उन्हें चलाने से पहले उन्हें अनपैक करता है, जैसे आप वर्णन करते हैं (EDIT: py2exe में यह सुविधा भी है, मिंट्टी का जवाब देखें )

मैं svn से PyInstaller के संस्करण का उपयोग करता हूं, क्योंकि नवीनतम रिलीज़ (1.3) कुछ पुराना है। यह वास्तव में एक ऐप के लिए अच्छी तरह से काम कर रहा है जो PyQt, PyQwt, numpy, scipy और कुछ और पर निर्भर करता है।


5
मैंने पाया कि py2.exe pyInstaller की तुलना में बहुत बेहतर है, जब आप अंडे का उपयोग कर रहे हैं। मिन्टी का जवाब समाधान है।
gbjbaanb

कृपया ध्यान दें कि संस्करण 1.4 के रूप में, PyInstaller विंडोज पर Python 2.6+ का समर्थन नहीं करता है
Joril

2
मैं अब संस्करण 1.5.1 का उपयोग कर रहा हूं, और यह पायथन 2.7.2 के साथ काम करता है।
oob

1
यदि आप कंपाइलर प्रोग्राम में कुछ तर्क निर्दिष्ट करते हैं, तो py2exe एक एकल फ़ाइल निष्पादन योग्य बना सकता है। py2exe में ऑनलाइन एकल फ़ाइल निष्पादन के लिए एक ट्यूटोरियल है।
trevorKirkby

2
वस्तुनिष्ठ दृष्टिकोण: मैं नहीं देखता कि यह एक स्वीकार्य उत्तर कैसे है क्योंकि यह py2.exe के साथ एक एकल exe फ़ाइल बनाने के प्रश्न को संबोधित नहीं करता है। (फिर भी, यह पाठ्यक्रम का एक उपयोगी उत्तर है।)
जोनाथन कोमार

171

Py2.exe का उपयोग करने का तरीका अपनी setup.py फ़ाइल में बंडल_फाइल्स विकल्प का उपयोग करना है। एक एकल फ़ाइल के लिए आप bundle_files1 पर सेट करना चाहते हैं , compressedट्रू में, और जिपफाइल विकल्प को कोई भी सेट नहीं करना है। इस तरह यह आसान वितरण के लिए एक संपीड़ित फ़ाइल बनाता है।

यहाँ py2exe साइट से सीधे उद्धृत बंडल विकल्प का अधिक पूर्ण विवरण है *

"बंडल_फाइल्स" और "जिपफाइल" का उपयोग करना

एकल-फ़ाइल निष्पादन योग्य बनाने का एक आसान (और बेहतर) तरीका बंडल_फाइल्स को 1 या 2 पर सेट करना है, और किसी को भी zipfile सेट करना है। इस दृष्टिकोण को अस्थायी स्थान पर फ़ाइलों को निकालने की आवश्यकता नहीं होती है, जो बहुत तेज़ प्रोग्राम स्टार्टअप प्रदान करता है।

बंडल_फाइल्स के लिए मान्य मूल्य हैं:

  • 3 (डिफ़ॉल्ट) बंडल नहीं है
  • 2 सब कुछ बंडल लेकिन अजगर दुभाषिया
  • 1 सब कुछ, अजगर दुभाषिया सहित बंडल

अगर जिपफाइल कोई भी सेट नहीं है, तो लाइब्रेरी के बजाय निष्पादन योग्य के भीतर फाइलें बंडल हो जाएंगी।

यहाँ एक नमूना setup.py है:

from distutils.core import setup
import py2exe, sys, os

sys.argv.append('py2exe')

setup(
    options = {'py2exe': {'bundle_files': 1, 'compressed': True}},
    windows = [{'script': "single.py"}],
    zipfile = None,
)

5
सुनिश्चित करें कि यदि आप केवल दुभाषिया को बंडल नहीं करना चाहते हैं तो बंडल_फाइल्स विकल्प के लिए 2 चुनें। सौभाग्य!
मिन्टी

13
कृपया ध्यान दें कि बंडल_फाइल्स 1 को amd64 (अजगर 2 पर
0.6.9

2
@Pat: py2exe चलाने का कॉल "python setup.py py2exe" है। अंत में "py2exe" को स्वचालित रूप से जोड़कर, इसका मतलब है कि आपको इसे कमांड लाइन पर टाइप करने की आवश्यकता नहीं है।
orlade

2
बिल्कुल एक भी निष्पादन योग्य नहीं है, क्योंकि आपको Microsoft Visual C रनटाइम DLL को स्थापित करने की आवश्यकता है ।
केविन स्मिथ

2
मेरे पास एक कंसोल एप्लिकेशन था जिसे मैं एक एकल निष्पादन योग्य के रूप में लेना चाहता था। मुझे इतनी डबल क्लिक करने के windows = [{'script': "single.py"}]साथ प्रतिस्थापित console = ['single.py']करना होगा कि फाइल विंडोज में सीएमडी विंडो में खुलेगी।
जेफ बी

13

अन्य पोस्टर उल्लेख के रूप में, py2exe, लोड करने के लिए एक निष्पादन योग्य + कुछ लाइब्रेरी उत्पन्न करेगा। आपके पास अपने प्रोग्राम में जोड़ने के लिए कुछ डेटा भी हो सकते हैं।

अगला कदम एक इंस्टॉलर का उपयोग करना है, यह सब एक आसान-से-उपयोग करने योग्य / असंगत कार्यक्रम में पैकेज करना है।

मैंने कई वर्षों तक और वाणिज्यिक कार्यक्रमों के लिए आनंद के साथ InnoSetup ( http://www.jrsoftware.org/isinfo.php ) का उपयोग किया है , इसलिए मैं दिल से इसकी सिफारिश करता हूं।


+1 इंगित करने के लिए कि py2exe के बाद भी पैकेज में चीजें हैं।
जौनकिन

6

मैं exe में एम्बेड किए गए सभी संसाधनों के साथ एक एकल exe फ़ाइल बनाने में सक्षम रहा हूँ। मैं खिड़कियों पर निर्माण कर रहा हूं। ताकि कुछ os.system कॉल्स का उपयोग करके समझाऊंगा।

पहले मैंने अपनी सभी छवियों को बिटमैट्स में बदलने की कोशिश की और फिर अपने सभी डेटा फ़ाइलों को टेक्स्ट स्ट्रिंग्स में बदल दिया। लेकिन इससे अंतिम निर्वासन बहुत बड़ा हो गया।

एक हफ्ते के लिए Googleing के बाद मुझे पता चला कि मेरी ज़रूरतों को पूरा करने के लिए py2.exe स्क्रिप्ट को कैसे बदलना है।

यहाँ प्रस्तुत स्रोत पर पैच लिंक है, कृपया टिप्पणी पोस्ट करें ताकि हम इसे अगले वितरण में शामिल कर सकें।

http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583

यह किए गए सभी परिवर्तनों की व्याख्या करता है, मैंने बस सेटअप लाइन में एक नया विकल्प जोड़ा है। यहाँ मेरा setup.py है।

मैं इसे सबसे अच्छा मैं कर सकता हूँ के रूप में टिप्पणी करने की कोशिश करेंगे। कृपया जान लें कि मेरा setup.py जटिल है कि मैं फ़ाइल नाम से छवियों का उपयोग कर रहा हूँ। इसलिए मुझे उन पर नज़र रखने के लिए एक सूची संग्रहीत करनी चाहिए।

यह एक टू-बी स्क्रीन सेवर है जिसे मैं बनाने की कोशिश कर रहा था।

मैं अपने सेटअप को रन टाइम पर जेनरेट करने के लिए इस्तेमाल करता हूं, इसके कट को आसान और इस तरह पेस्ट करना।

exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
      'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
      options={'py2exe': py2exe_options},\
      zipfile = None )" % (bitmap_string[:-1])

टूट - फूट

स्क्रिप्ट = py स्क्रिप्ट मैं एक exe की ओर मुड़ना चाहता हूं

icon_resources = exe के लिए आइकन

file_resources = फाइलें जो मैं exe में एम्बेड करना चाहता हूं

other_resource = exe में एम्बेड करने के लिए एक स्ट्रिंग, इस मामले में एक फ़ाइल सूची।

विकल्प = एक exe फ़ाइल में सब कुछ बनाने के लिए py2exe विकल्प

बिटमैप_स्ट्रिंग्स = शामिल करने के लिए फ़ाइलों की एक सूची

कृपया ध्यान दें कि फ़ाइल_स्रोत एक वैध विकल्प नहीं है जब तक कि आप अपनी py2exe.py फ़ाइल को संपादित नहीं करते जैसा कि ऊपर दिए गए लिंक में बताया गया है।

पहली बार मैंने इस साइट पर कोड पोस्ट करने की कोशिश की है, अगर मुझे यह गलत लगता है तो मुझे लौ न दें।

from distutils.core import setup
import py2exe #@UnusedImport
import os

#delete the old build drive
os.system("rmdir /s /q dist")

#setup my option for single file output
py2exe_options = dict( ascii=True,  # Exclude encodings
                       excludes=['_ssl',  # Exclude _ssl
                                 'pyreadline', 'difflib', 'doctest', 'locale',
                                 'optparse', 'pickle', 'calendar', 'pbd', 'unittest', 'inspect'],  # Exclude standard library
                       dll_excludes=['msvcr71.dll', 'w9xpopen.exe',
                                     'API-MS-Win-Core-LocalRegistry-L1-1-0.dll',
                                     'API-MS-Win-Core-ProcessThreads-L1-1-0.dll',
                                     'API-MS-Win-Security-Base-L1-1-0.dll',
                                     'KERNELBASE.dll',
                                     'POWRPROF.dll',
                                     ],
                       #compressed=None,  # Compress library.zip
                       bundle_files = 1,
                       optimize = 2                        
                       )

#storage for the images
bitmap_string = '' 
resource_string = ''
index = 0

print "compile image list"                          

for image_name in os.listdir('images/'):
    if image_name.endswith('.jpg'):
        bitmap_string += "( " + str(index+1) + "," + "'" + 'images/' + image_name + "'),"
        resource_string += image_name + " "
        index += 1

print "Starting build\n"

exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
      'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
      options={'py2exe': py2exe_options},\
      zipfile = None )" % (bitmap_string[:-1])

print "Removing Trash"
os.system("rmdir /s /q build")
os.system("del /q *.pyc")
print "Build Complete"

ठीक है, अब इसे सेटअप के लिए तैयार कर दिया है। मैंने इस ऐप को बिना py2exe को ध्यान में रखते हुए विकसित किया और बाद में इसे जोड़ा। तो आप दोनों स्थितियों के लिए पहुँच देखेंगे। अगर छवि फ़ोल्डर नहीं मिल सकता है तो यह एक्सई संसाधनों से छवियों को खींचने की कोशिश करता है। कोड इसे समझाएगा। यह मेरे स्प्राइट क्लास का हिस्सा है और यह एक डायरेक्टेक्स का उपयोग करता है। लेकिन आप अपनी इच्छानुसार किसी भी एपीआई का उपयोग कर सकते हैं या केवल कच्चे डेटा का उपयोग कर सकते हैं। कोई बात नहीं।

def init(self):
    frame = self.env.frame
    use_resource_builtin = True
    if os.path.isdir(SPRITES_FOLDER):
        use_resource_builtin = False
    else:
        image_list = LoadResource(0, u'INDEX', 1).split(' ')

    for (model, file) in SPRITES.items():
        texture = POINTER(IDirect3DTexture9)()
        if use_resource_builtin: 
            data = LoadResource(0, win32con.RT_RCDATA, image_list.index(file)+1) #windll.kernel32.FindResourceW(hmod,typersc,idrsc)               
            d3dxdll.D3DXCreateTextureFromFileInMemory(frame.device,   #Pointer to an IDirect3DDevice9 interface
                                              data,                #Pointer to the file in memory
                                              len(data),           #Size of the file in memory
                                              byref(texture))      #ppTexture
        else:
            d3dxdll.D3DXCreateTextureFromFileA(frame.device, #@UndefinedVariable
                                               SPRITES_FOLDER + file,
                                               byref(texture))            
        self.model_sprites[model] = texture
    #else:
    #    raise Exception("'sprites' folder is not present!")

कोई भी प्रश्न पूछने के लिए स्वतंत्र हो गया।


मैंने आपके तरीके को आज़माया है और यह अच्छा काम करता है, लेकिन मुझे समझ नहीं आ रहा है कि फ़ाइल में कुछ फ़ाइल को जोड़ने के लिए विकल्प file_resurces में फ़ाइल कैसे जोड़ें। जैसा कि आपने कहा था कि मैंने build_exe.py फ़ाइल को संशोधित किया है, लेकिन जब मैं setup.py फ़ाइल में जाता हूँ और मैं लिखता हूँ तो \'file_resources': [('txt2.txt')]यह मुझे त्रुटि देता है (जिस फ़ाइल को मैं अपने। Exe में रखना चाहता हूँ उसका नाम txt2 है और यह एक .txt फ़ाइल है। )
विंसलोमा

आपने इस बारे में बात की कि आपने अपनी सभी छवियों को बिटमैट्स में कैसे बदल दिया और फिर अपनी सभी डेटा फ़ाइलों को टेक्स्ट स्ट्रिंग्स में बदल दिया। भले ही आपने कहा था कि यह निर्वासन को बड़ा बनाता है, क्या यह काम करता है और यदि हां, तो क्या आप मुझे बता सकते हैं कि यह कैसे करना है? मुझे पता है कि यह उत्तर बहुत पुराना है, लेकिन अगर आप इसका जवाब दे सकते हैं, तो इसकी सराहना की जाएगी।
Peppa

4

आपको एक इंस्टॉलर बनाना चाहिए, जैसा कि पहले उल्लेख किया गया है। हालाँकि, यह संभव भी है कि py2exe बंडल को एक ही निष्पादन योग्य में सब कुछ करने के लिए बंडल 1 के लिए बंडल_फाइल विकल्प और कोई भी zipfile कीवर्ड तर्क सेट करके, मैं PyGTK अनुप्रयोगों के लिए इसकी अनुशंसा नहीं करता।

ऐसा इसलिए है क्योंकि GTK + उस निर्देशिका से अपनी डेटा फ़ाइलों (स्थानीय लोगों, विषयों आदि) को लोड करने की कोशिश करता है, जिनसे इसे लोड किया गया था। इसलिए आपको यह सुनिश्चित करना होगा कि आपके निष्पादन योग्य की निर्देशिका में GTK + द्वारा उपयोग की जाने वाली लाइब्रेरी भी हैं और आपकी GTK + की स्थापना से लिबास, शेयर और आदि। अन्यथा आपको एक मशीन पर अपना आवेदन चलाने में समस्या आएगी जहां जीटीके + सिस्टम-वाइड स्थापित नहीं है।

अधिक जानकारी के लिए PyGTK अनुप्रयोगों के लिए py2exe के लिए मेरा गाइड पढ़ें । यह भी बताता है कि सब कुछ कैसे बंडल किया जाए, लेकिन जीटीके +।


1

मुझे बताया गया है कि bbfreeze एक एकल फ़ाइल .EXE बनाएगा, और py2.exe की तुलना में नया है।


3
जहां तक ​​मैं समझ सकता हूं कि बीबफ्रीज एकल-फाइल निष्पादन योग्य नहीं है। क्या आप अपने उत्तर का दस्तावेज दे सकते हैं?
जौनकिन

-2

मैंने हाल ही में ReviewBoard में समीक्षा भेजने के लिए समीक्षा के बाद एक निष्पादन योग्य बनाने के लिए py2exe का उपयोग किया।

यह मैंने इस्तेमाल किया सेटअप सेटअप था

from distutils.core import setup
import py2exe

setup(console=['post-review'])

यह exe फ़ाइल और आवश्यक पुस्तकालयों युक्त एक निर्देशिका बनाया। मुझे नहीं लगता कि सिर्फ एक .exe फ़ाइल प्राप्त करने के लिए py2exe का उपयोग करना संभव है। यदि आपको आवश्यकता है कि आपको पहले py2.exe का उपयोग करने की आवश्यकता होगी और फिर अंतिम निष्पादन योग्य बनाने के लिए इंस्टॉलर के कुछ रूप का उपयोग करें।

एक बात का ध्यान रखें कि आपके आवेदन में आपके द्वारा उपयोग की जाने वाली किसी भी अंडे की फ़ाइलों को अनज़िप करने की आवश्यकता है, अन्यथा py2exe उन्हें शामिल नहीं कर सकता है। यह py2exe डॉक्स में कवर किया गया है।


-2

c_x को फ्रीज करने का प्रयास करें यह एक अच्छा स्टैंडअलोन बना सकता है


cx_Freeze एक स्टैंडअलोन निष्पादन योग्य नहीं बना सकते, वास्तव में, पर cx_Freeze के लिए दस्तावेज़ buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/... कहते हैं, "cx_Freeze के सभी एक एकल फाइल exe का निर्माण, जहां का समर्थन नहीं करता आपके एप्लिकेशन के लिए लाइब्रेरी एक निष्पादन योग्य फ़ाइल में एम्बेडेड हैं। " Cx_Freeze में स्टैंडअलोन निष्पादन पर अधिक जानकारी के लिए दस्तावेज़ीकरण पर जाएं ( buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/… ) और धारा 4.5 पर जाएं।
Peppa

-6

नहीं, यह आपको इस अर्थ में एक भी निष्पादन योग्य नहीं देता है कि आपके पास केवल एक फ़ाइल है - लेकिन आपके पास एक निर्देशिका है जिसमें आपके प्रोग्राम को चलाने के लिए आवश्यक सभी चीजें हैं, जिसमें एक exe फ़ाइल भी शामिल है।

मैंने आज ही यह setup.py लिखा है। आपको केवल आह्वान करने की आवश्यकता है python setup.py py2exe


1
यह सटीक नहीं है। सही विकल्पों के साथ, आप एक स्टैंडअलोन फ़ाइल प्राप्त कर सकते हैं।
trevorKirkby

@Torsten Marek ... आपके सेटअप के लिंक मृत है। विशेष रूप से .. पहले दो रिडरेक्ट्स वाणिज्यिक सामान को बढ़ावा देते हैं। तीसरी बार यह इंटरनेट के डेड-एंड पर समाप्त होता है
ZF007
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.