py2exe - tek bir yürütülebilir dosya oluştur


141

Py2exe'nin bunu yapabildiğini duyduğumu sanıyordum , ama asla çözemedim. Bunu başarıyla yapan var mı? Setup.py dosyanızı ve hangi komut satırı seçeneklerini kullandığınızı görebilir miyim?

Temelde bana belki / temp ve çalışır unzips gibi bir şey yapan tek bir yürütülebilir dosya vererek düşünüyorum.


Bu Python 3 veya python 2'den sonraki sürümler için geçerli mi?
Vincent

Yanıtlar:


105

PyInstaller bağımlılığı olmayan tek bir .exe dosyası oluşturur; kullanmak --onefileseçeneği. Bunu, gerekli tüm paylaşılan kütüphaneleri yürütülebilir dosyaya paketleyerek ve çalıştırmadan önce paketlerini açarak yapar, tıpkı sizin tarif ettiğiniz gibi (EDIT: py2exe de bu özelliğe sahiptir, naneli cevaba bakınız )

En son sürüm (1.3) biraz modası geçmiş olduğundan, svn'den PyInstaller sürümünü kullanıyorum. PyQt, PyQwt, numpy, scipy ve birkaç taneye bağlı bir uygulama için gerçekten iyi çalışıyor.


5
Yumurta kullandığınızda py2exe'nin pyInstaller'dan çok daha iyi çalıştığını gördüm. nanty'nin cevabı çözümdür.
gbjbaanb

1.4 sürümünden itibaren PyInstaller'in Windows'ta Python 2.6+ sürümünü desteklemediğini unutmayın
Joril

2
Şimdi 1.5.1 sürümünü kullanıyorum ve Python 2.7.2 ile çalışıyor.
oob

1
Derleyici programında birkaç bağımsız değişken belirtirseniz, py2exe tek bir yürütülebilir dosya oluşturabilir. py2exe çevrimiçi tek dosya yürütülebilir için bir öğretici vardır.
trevorKirkby

2
Amaç Bakış Açısı: Py2exe ile tek bir exe dosyası oluşturma sorusuna değinmediği için bu kabul edilebilir bir cevap nasıl görmüyorum. (Bununla birlikte, bu elbette yararlı bir cevaptır.)
Jonathan Komar

171

Py2exe kullanarak bunu yapmanın yolu, setup.py dosyanızdaki bundle_files seçeneğini kullanmaktır. Tek bir dosya bundle_filesiçin 1, compressedTrue olarak ve zipfile seçeneğini Yok olarak ayarlamak isteyeceksiniz . Bu şekilde kolay dağıtım için bir sıkıştırılmış dosya oluşturur.

Doğrudan py2exe sitesinden alıntılanan bundle_file seçeneğinin daha eksiksiz açıklaması aşağıdadır *

"Bundle_files" ve "zipfile" kullanma

Tek dosya yürütülebilir dosyaları oluşturmanın daha kolay (ve daha iyi) bir yolu, bundle_files değerini 1 veya 2'ye ayarlamak ve zipfile'ı None olarak ayarlamaktır. Bu yaklaşım, dosyaların daha hızlı bir şekilde program başlatılmasını sağlayan geçici bir konuma çıkarılmasını gerektirmez.

Bundle_files için geçerli değerler:

  • 3 (varsayılan) gruplama
  • 2 Python yorumlayıcısı dışında her şeyi bir araya getirir
  • Python yorumlayıcısı dahil her şeyi 1 paketle

Zipfile Yok olarak ayarlanırsa, dosyalar library.zip yerine yürütülebilir dosya içinde paketlenir.

İşte örnek bir 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
Yalnızca yorumlayıcının paketlenmemesini istiyorsanız, bundle_files seçeneği için 2'yi seçin. İyi şanslar!
minty

13
Lütfen bundle_files 1'in amd64'te desteklenmediğini unutmayın (en azından Python 2.6 için py2exe 0.6.9)
Joril

2
@Pat: py2exe'yi çalıştırma çağrısı "python setup.py py2exe" dir. "Py2exe" yi otomatik olarak sonuna ekleyerek, komut satırına yazmanız gerekmediği anlamına gelir.
orlade

2
Tam olarak tek bir yürütülebilir dosya değil, çünkü Microsoft Visual C runtime DLL dosyasını kurmanız gerekiyor .
Kevin Smyth

2
Tek bir yürütülebilir dosya olarak kullanmak istediğim bir konsol uygulamam vardı. Ben değiştirmek zorunda kaldık windows = [{'script': "single.py"}]ile console = ['single.py']Windows'daki bir CMD penceresinde açacak dosyasını çift tıklayarak.
Jeff B

13

Diğer posterden bahsedildiği gibi, py2exe, yürütülebilir + yüklenecek bazı kütüphaneler üretecektir. Programınıza eklemek için bazı verileriniz de olabilir.

Bir sonraki adım, tüm bunları kullanımı kolay tek bir yüklenebilir / unistallable programında paketlemek için bir yükleyici kullanmaktır.

InnoSetup ( http://www.jrsoftware.org/isinfo.php ) birkaç yıl boyunca ve ticari programlar için zevkle kullandım, bu yüzden yürekten tavsiye ederim.


+1, py2exe'den sonra hala paketlenecek şeyler olduğunu göstermek için.
joaquin

6

Ben exe gömülü tüm kaynakları ile tek bir exe dosyası oluşturmak mümkün. Pencereler üzerine inşa ediyorum. böylece kullandığım os.system çağrılarından bazılarını açıklayacağız.

Önce tüm görüntülerimi bitmatlara, sonra da tüm veri dosyalarımı metin dizelerine dönüştürmeyi denedim. ancak bu son exe'nin çok büyük olmasına neden oldu.

Bir hafta boyunca googleing sonra nasıl benim ihtiyaçlarını karşılamak için py2exe komut dosyası değiştirmek anladım.

Gönderdiğim sourceforge'daki yama bağlantısı, lütfen bir sonraki dağıtımda yer alabilmemiz için yorum gönderin.

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

Bu yapılan tüm değişiklikleri açıklıyor, ben sadece kurulum hattına yeni bir seçenek ekledim. İşte benim setup.py.

Ben elimden gelenin en iyisini yorum yapmaya çalışacağım. Setup.py dosyamın görüntülere dosya adına eriştiğim için karmaşık olduğunu lütfen unutmayın. bu yüzden onları takip etmek için bir liste saklamalıyım.

Bu yapmaya çalıştığım bir ekran koruyucu.

Kurulumumu çalışma zamanında oluşturmak için exec kullanıyorum, bu şekilde kesip yapıştırmak daha kolay.

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])

Yıkmak

script = py script bir exe açmak istiyorum

icon_resources = exe simgesi

file_resources = exe'ye yerleştirmek istediğim dosyalar

other_resources = exe'ye gömülecek bir dize, bu durumda bir dosya listesi.

options = py2exe her şeyi bir exe dosyasına oluşturmak için seçenekler

bitmap_strings = dahil edilecek dosyaların listesi

Lütfen yukarıdaki linkte açıklandığı gibi py2exe.py dosyanızı düzenleyene kadar file_resources'nin geçerli bir seçenek olmadığını unutmayın.

ilk kez ben bu sitede kod göndermeye çalıştım, eğer yanlış alırsanız beni alev yok.

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"

tamam, bu kurulum için t.py şimdi sihirli görüntüler erişmek gerekiyordu. Aklımda py2exe olmadan bu uygulamayı geliştirdikten sonra daha sonra ekledi. böylece her iki durum için de erişim görürsünüz. resim klasörü bulunamazsa, görüntüleri exe kaynaklarından almaya çalışır. kod açıklayacaktır. bu benim sprite sınıfımın bir parçası ve bir directx kullanıyor. ancak istediğiniz herhangi bir API'yi kullanabilir veya yalnızca ham verilere erişebilirsiniz. önemli değil.

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!")

Herhangi bir soru sormaktan çekinmeyin.


Metodunuzu denedim ve iyi çalışıyor ama .exe dosyasına bazı dosya gömmek için file_resurces seçeneğine nasıl dosya ekleyeceğimi bilmiyorum. Dediğin gibi build_exe.py dosyasını değiştirdim ama setup.py dosyasına girip yazdığımda \'file_resources': [('txt2.txt')]bana hata veriyor (.exe dosyama yerleştirmek istediğim dosya txt2 olarak adlandırılıyor ve bir .txt dosyası )
VinceLomba

Tüm resimlerinizi bitmatlara ve sonra tüm veri dosyalarınızı metin dizelerine nasıl dönüştürdüğünüzden bahsettiniz. Exe'yi büyük yaptığını söylemiş olsanız bile, bu işe yarıyor mu ve eğer öyleyse, bunu nasıl yapacağımı söyleyebilir misiniz? Bu cevabın oldukça eski olduğunu biliyorum ama cevap verebilirseniz takdir edilecektir.
Peppa

4

Daha önce de belirtildiği gibi bir yükleyici oluşturmanız gerekir. Ayrıca, bundle_files seçeneğini 1 ve zipfile anahtar kelime bağımsız değişkenini None olarak ayarlayarak py2exe'nin her şeyi tek bir yürütülebilir dosyaya paketlemesine izin vermek mümkün olsa da, bunu PyGTK uygulamaları için önermiyorum.

Bunun nedeni, GTK + 'nın veri dosyalarını (yerel ayarlar, temalar vb.) Yüklendiği dizinden yüklemeye çalışmasıdır. Bu nedenle, çalıştırılabilir dizininin GTK + tarafından kullanılan kütüphaneleri ve GTK + kurulumunuzdaki lib, share vb dizinlerini içerdiğinden emin olmalısınız. Aksi takdirde, uygulamanızı GTK + 'nın sistem genelinde yüklü olmadığı bir makinede çalıştırırken sorun yaşarsınız.

Daha fazla ayrıntı için PyGTK uygulamaları için py2exe rehberimi okuyun . Ayrıca GTK + hariç her şeyin nasıl paketleneceğini açıklar.


1

Ben bbfreeze tek bir dosya .EXE oluşturacak ve py2exe daha yeni söylendi .


3
Bildiğim kadarıyla bbfreeze tek dosya yürütülebilir dosyaları üretmez. Cevabınızı belgeleyebilir misiniz?
joaquin

-2

Kısa bir süre önce, ReviewBoard'a inceleme göndermek için inceleme sonrası için bir yürütülebilir dosya oluşturmak amacıyla py2exe kullandım.

Kullandığım setup.py buydu

from distutils.core import setup
import py2exe

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

Exe dosyasını ve gerekli kütüphaneleri içeren bir dizin yarattı. Ben sadece tek bir .exe dosyası almak için py2exe kullanmak mümkün olduğunu sanmıyorum. Eğer ihtiyacınız varsa ilk önce py2exe kullanmak ve daha sonra son yürütülebilir yapmak için yükleyici bir tür kullanmanız gerekecektir.

Dikkat edilmesi gereken bir şey, uygulamanızda kullandığınız yumurta dosyalarının sıkıştırılmış olması gerektiğidir, aksi takdirde py2exe bunları içeremez. Bu, py2exe belgelerinde yer almaktadır.


-2

c_x dondurma deneyin iyi bir bağımsız oluşturabilirsiniz


cx_Freeze aslında, en cx_Freeze için dokümantasyon, tek başına yürütülebilir oluşturamazsınız buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/... diyor, "cx_Freeze nerede, hepsi tek bir dosya exe bina desteklemiyor uygulamanızın kitaplıkları tek bir yürütülebilir dosyaya yerleştirilmiştir. " Cx_Freeze'deki bağımsız yürütülebilir dosyalar hakkında daha fazla bilgi için belgelere ( buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/… ) gidin ve bölüm 4.5'e gidin.
Peppa

-6

Hayır, daha sonra yalnızca bir dosyanız olması açısından size tek bir yürütülebilir dosya vermez - ancak bir exe dosyası da dahil olmak üzere programınızı çalıştırmak için ihtiyacınız olan her şeyi içeren bir dizininiz vardır.

Bu setup.py'yi bugün yazdım . Sadece çağırmanız gerekir python setup.py py2exe.


1
Bu doğru değil. Doğru seçeneklerle tek bir bağımsız dosya alabilirsiniz.
trevorKirkby

@Torsten Marek ... setup.py'nizin bağlantısı öldü. Özellikle .. ilk iki ticari sonuç teşvik sona erer. Üçüncü kez burada internetin çıkmaz noktasında bitiyor .
ZF007
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.