py2exe - menghasilkan satu file yang dapat dieksekusi

141

Saya pikir saya mendengar bahwa py2exe dapat melakukan ini, tetapi saya tidak pernah menemukan jawabannya. Adakah yang berhasil melakukan ini? Bisakah saya melihat file setup.py Anda, dan opsi baris perintah apa yang Anda gunakan?

Pada dasarnya saya memikirkannya memberi saya satu file yang dapat dieksekusi yang melakukan sesuatu seperti membuka ritsleting sendiri untuk mungkin / temp dan berjalan.

Greg
sumber
Apakah ini berlaku untuk Python 3, atau versi setelah python 2?
Vincent

Jawaban:

105

PyInstaller akan membuat file .exe tunggal tanpa dependensi; gunakan --onefileopsi. Itu melakukan ini dengan mengemas semua lib yang dibagikan yang diperlukan ke dalam executable, dan membongkar mereka sebelum berjalan, seperti yang Anda jelaskan (EDIT: py2exe juga memiliki fitur ini, lihat jawaban minty )

Saya menggunakan versi PyInstaller dari svn, karena rilis terbaru (1.3) agak ketinggalan jaman. Ini telah bekerja dengan sangat baik untuk aplikasi yang bergantung pada PyQt, PyQwt, numpy, scipy dan beberapa lainnya.

dF.
sumber
5
Saya menemukan py2exe bekerja jauh lebih baik daripada pyInstaller, ketika Anda menggunakan telur. Jawaban minty adalah solusinya.
gbjbaanb
Harap dicatat bahwa pada versi 1.4, PyInstaller tidak mendukung Python 2.6+ pada Windows
Joril
2
Saya sekarang menggunakan versi 1.5.1, dan bekerja dengan Python 2.7.2.
oob
1
py2exe dapat membuat satu file yang dapat dieksekusi jika Anda menentukan beberapa argumen dalam program kompiler. py2exe memiliki tutorial untuk file tunggal yang dapat dieksekusi secara online.
trevorKirkby
2
Sudut Pandang Tujuan: Saya tidak melihat bagaimana ini merupakan jawaban yang dapat diterima karena tidak menjawab pertanyaan tentang membuat file exe tunggal dengan py2exe. (Meskipun demikian, tentu saja ini adalah jawaban yang berguna.)
Jonathan Komar
171

Cara untuk melakukan ini menggunakan py2exe adalah dengan menggunakan opsi bundle_files di file setup.py Anda. Untuk satu file, Anda ingin mengatur bundle_fileske 1,compressed ke True, dan mengatur opsi zipfile ke None. Dengan cara itu ia membuat satu file terkompresi untuk distribusi mudah.

Berikut adalah deskripsi yang lebih lengkap dari opsi bundle_file yang dikutip langsung dari situs py2exe *

Menggunakan "bundle_files" dan "zipfile"

Cara yang lebih mudah (dan lebih baik) untuk membuat file executable tunggal adalah dengan mengatur bundle_files ke 1 atau 2, dan untuk mengatur zipfile ke None. Pendekatan ini tidak memerlukan ekstraksi file ke lokasi sementara, yang menyediakan startup program yang jauh lebih cepat.

Nilai yang valid untuk bundle_files adalah:

  • 3 (default) tidak dibundel
  • 2 bundel segalanya kecuali juru bahasa Python
  • 1 bundel semuanya, termasuk juru bahasa Python

Jika zipfile diatur ke Tidak Ada, file akan bundel di dalam executable, bukan library.zip.

Berikut ini contoh 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,
)
minty
sumber
5
Tentu jika Anda ingin hanya juru bahasa tidak dibundel maka pilih 2 untuk opsi bundle_files. Semoga berhasil!
minty
13
Harap dicatat bahwa bundle_files 1 tidak didukung di amd64 (setidaknya py2exe 0.6.9 untuk Python 2.6)
Joril
2
@Pat: Panggilan untuk menjalankan py2exe adalah "python setup.py py2exe". Dengan secara otomatis menambahkan "py2exe" di bagian akhir, itu berarti Anda tidak perlu mengetiknya di baris perintah.
orlade
2
Tidak persis satu executable, yang Anda butuhkan untuk menginstal Microsoft Visual C runtime DLL .
Kevin Smyth
2
Saya memiliki aplikasi konsol yang ingin saya miliki sebagai satu executable. Saya harus mengganti windows = [{'script': "single.py"}]dengan console = ['single.py']mengklik dua kali file akan terbuka di jendela CMD di Windows.
Jeff B
13

Seperti yang disebutkan poster lainnya, py2exe, akan menghasilkan + beberapa library yang dapat dieksekusi untuk dimuat. Anda juga dapat memiliki beberapa data untuk ditambahkan ke program Anda.

Langkah selanjutnya adalah menggunakan installer, untuk mengemas semua ini menjadi satu program installable / unistallable yang mudah digunakan.

Saya telah menggunakan InnoSetup ( http://www.jrsoftware.org/isinfo.php ) dengan senang selama beberapa tahun dan untuk program komersial, jadi saya sungguh-sungguh merekomendasikannya.

Philippe F
sumber
+1 untuk menunjukkan bahwa setelah py2exe masih ada hal-hal untuk dipaketkan.
joaquin
6

Saya sudah bisa membuat file exe tunggal dengan semua sumber daya dimasukkan ke exe. Saya sedang membangun di jendela. jadi itu akan menjelaskan beberapa panggilan sistem. Saya menggunakan.

Pertama saya mencoba mengubah semua gambar saya menjadi bitmats dan kemudian semua file data saya menjadi string teks. tetapi ini menyebabkan exe terakhir menjadi sangat besar.

Setelah googleing selama seminggu saya menemukan cara mengubah skrip py2exe untuk memenuhi kebutuhan saya.

di sini adalah tautan tambalan pada sourceforge yang saya kirimkan, silakan kirim komentar sehingga kita bisa memasukkannya dalam distribusi berikutnya.

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

ini menjelaskan semua perubahan yang dilakukan, saya cukup menambahkan opsi baru ke baris setup. di sini adalah setup.py saya.

Saya akan mencoba berkomentar sebisa mungkin. Perlu diketahui bahwa setup.py saya rumit karena fakta bahwa saya mengakses gambar dengan nama file. jadi saya harus menyimpan daftar untuk melacaknya.

ini dari screen saver ingin-ke-b yang saya coba buat.

Saya menggunakan exec untuk menghasilkan setup saya pada saat run time, lebih mudah untuk memotong dan menempel seperti itu.

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

kerusakan

script = py script saya ingin beralih ke exe

icon_resources = ikon untuk exe

file_resources = file yang ingin saya embed ke dalam exe

other_resources = string untuk dimasukkan ke exe, dalam hal ini daftar file.

options = opsi py2exe untuk membuat semuanya menjadi satu file exe

bitmap_strings = daftar file yang akan disertakan

Harap perhatikan bahwa file_resources bukan opsi yang valid sampai Anda mengedit file py2exe.py Anda seperti yang dijelaskan dalam tautan di atas.

pertama kali saya mencoba memposting kode di situs ini, jika saya salah jangan memecat saya.

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"

ok, itu saja untuk setup.py sekarang sihir diperlukan mengakses gambar. Saya mengembangkan aplikasi ini tanpa mengingat py2exe kemudian menambahkannya nanti. jadi Anda akan melihat akses untuk kedua situasi. jika folder gambar tidak dapat ditemukan mencoba menarik gambar dari sumber daya exe. kode akan menjelaskannya. ini adalah bagian dari kelas sprite saya dan menggunakan directx. tetapi Anda dapat menggunakan api apa pun yang Anda inginkan atau hanya mengakses data mentah. tidak masalah.

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

Setiap pertanyaan jatuh bebas untuk diajukan.

Maupun
sumber
Saya sudah mencoba metode Anda dan itu berfungsi baik tetapi saya tidak mengerti dan bagaimana menambahkan file ke opsi file_resurces untuk memasukkan beberapa file ke .exe. Saya telah memodifikasi file build_exe.py seperti yang Anda katakan, tetapi ketika saya masuk ke file setup.py dan saya menulisnya \'file_resources': [('txt2.txt')]memberikan saya kesalahan (file yang ingin saya embel di file .exe saya bernama txt2 dan ini adalah file .txt )
VinceLomba
Anda berbicara tentang bagaimana Anda mengubah semua gambar Anda menjadi bitmap dan kemudian semua file data Anda menjadi string teks. Meskipun Anda mengatakan bahwa itu membuat exe menjadi besar, apakah ini berhasil dan jika demikian, dapatkah Anda memberi tahu saya cara melakukan ini? Saya tahu jawaban ini cukup lama tetapi jika Anda dapat meresponsnya akan sangat dihargai.
Peppa
4

Anda harus membuat pemasang, seperti yang disebutkan sebelumnya. Meskipun dimungkinkan untuk membiarkan py2exe bundle semuanya menjadi satu executable, dengan menetapkan opsi bundle_files ke 1 dan argumen kata kunci zipfile ke None, saya tidak merekomendasikan ini untuk aplikasi PyGTK.

Itu karena GTK + mencoba memuat file datanya (penduduk setempat, tema, dll.) Dari direktori tempat memuatnya. Jadi, Anda harus memastikan bahwa direktori executable Anda berisi juga perpustakaan yang digunakan oleh GTK + dan direktori lib, bagikan, dan lain-lain dari instalasi GTK + Anda. Kalau tidak, Anda akan mendapatkan masalah dalam menjalankan aplikasi pada mesin di mana GTK + tidak diinstal di seluruh sistem.

Untuk lebih jelasnya baca panduan saya ke py2exe untuk aplikasi PyGTK . Ini juga menjelaskan cara menggabungkan semuanya, tetapi GTK +.

Sebastian Noack
sumber
1

Saya diberitahu bbfreeze akan membuat satu file .EXE, dan lebih baru dari py2exe.

ℳ.
sumber
3
Sejauh yang saya mengerti bbfreeze tidak menghasilkan file executable tunggal. Bisakah Anda mendokumentasikan jawaban Anda?
joaquin
-2

Saya baru-baru ini menggunakan py2exe untuk membuat executable untuk post-review untuk mengirim ulasan ke ReviewBoard.

Ini adalah setup.py yang saya gunakan

from distutils.core import setup
import py2exe

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

Itu menciptakan direktori yang berisi file exe dan perpustakaan yang dibutuhkan. Saya rasa tidak mungkin menggunakan py2exe untuk mendapatkan hanya satu file .exe. Jika Anda perlu, Anda harus terlebih dahulu menggunakan py2exe dan kemudian menggunakan beberapa bentuk installer untuk membuat executable akhir.

Satu hal yang harus diperhatikan adalah bahwa semua file telur yang Anda gunakan dalam aplikasi Anda harus di-unzip, jika tidak py2exe tidak dapat memasukkannya. Ini tercakup dalam dokumen py2exe.

David Dibben
sumber
-2

coba c_x bekukan itu bisa membuat standalone yang bagus

Denis
sumber
cx_Freeze tidak dapat membuat eksekusi mandiri, pada kenyataannya, dokumentasi untuk cx_Freeze di buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/… mengatakan, "cx_Freeze tidak mendukung pembuatan satu file exe, di mana semua perpustakaan untuk aplikasi Anda tertanam dalam satu file yang dapat dieksekusi. " Untuk detail lebih lanjut tentang executable mandiri di cx_Freeze pergi ke dokumentasi ( buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/… ) dan pergi ke bagian 4.5.
Peppa
-6

Tidak, itu tidak memberi Anda satu executable dalam arti bahwa Anda hanya memiliki satu file sesudahnya - tetapi Anda memiliki direktori yang berisi semua yang Anda butuhkan untuk menjalankan program Anda, termasuk file exe.

Saya baru saja menulis setup.py ini hari ini. Anda hanya perlu memohon python setup.py py2exe.

Torsten Marek
sumber
1
Ini tidak akurat. Dengan opsi yang benar, Anda bisa mendapatkan satu file mandiri.
trevorKirkby
@ Torsten Marek ... tautan ke setup.py Anda sudah mati. Secara khusus .. dua rederect pertama akhirnya mempromosikan barang-barang komersial. Ketiga kalinya ini berakhir di sini di jalan buntu internet.
ZF007