py2exe - генерувати єдиний виконуваний файл


141

Я думав, що чув, що py2exe вміє це робити, але я ніколи цього не з'ясував. Хтось успішно це робив? Чи можу я побачити ваш файл setup.py та які параметри командного рядка ви використовували?

В основному я думаю про це, даючи мені єдиний виконуваний файл, який робить щось на зразок розпаковує себе, можливо, / temp та працює.


Чи це стосується Python 3 або версій після python 2?
Вінсент

Відповіді:


105

PyInstaller створить єдиний .exe файл без залежностей; використовувати --onefileваріант. Це робиться, запакувавши всі необхідні спільні конверти у виконуваний файл та розпакувавши їх до запуску, так само, як ви описуєте (EDIT: py2exe також має цю функцію, див . Відповідь м'яти )

Я використовую версію PyInstaller від svn, оскільки останній випуск (1.3) дещо застарів. Це дуже добре працює для програми, яка залежить від PyQt, PyQwt, numpy, scipy та ще декількох.


5
Я виявив, що py2exe працює набагато краще, ніж pyInstaller, коли ви використовуєте яйця. Відповідь м'яти - рішення.
gbjbaanb

Зверніть увагу, що станом на версію 1.4 PyInstaller не підтримує Python 2.6+ у Windows
Joril

2
Зараз я використовую версію 1.5.1, і вона працює з Python 2.7.2.
ооб

1
py2exe може створити єдиний виконуваний файл, якщо вказати кілька аргументів у програмі компілятора. py2exe має навчальний посібник для виконання одного файлу в Інтернеті.
trevorKirkby

2
Об'єктивна точка зору: Я не бачу, як це прийнятна відповідь, оскільки це не стосується питання створення одного EXE-файлу з py2exe. (Тим не менш, це корисна відповідь, звичайно.)
Джонатан Комар

171

Спосіб зробити це за допомогою py2exe - використовувати параметр bundle_files у вашому файлі setup.py. Для одного файлу потрібно встановити bundle_filesзначення 1, compressedзначення True, а для параметра zipfile встановити значення None. Таким чином він створює один стислий файл для легкого розповсюдження.

Ось більш повний опис параметра bundle_file, який цитується безпосередньо з сайту py2exe *

Використання "bundle_files" та "zipfile"

Найпростіший (і кращий) спосіб створити однофайлові файли - встановити bundle_files до 1 або 2, а zipfile - до None. Цей підхід не вимагає вилучення файлів до тимчасового місця, що забезпечує набагато швидший запуск програми.

Дійсні значення для bundle_files:

  • 3 (за замовчуванням) не зв'язувати
  • 2 з’єднайте все, крім інтерпретатора Python
  • 1 зв'язати все, включаючи інтерпретатор Python

Якщо для zipfile встановлено значення None, файли будуть в комплекті виконуваного файлу замість library.zip.

Ось зразок 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 для параметра bundle_files. Удачі!
м’ятний

13
Зверніть увагу, що bundle_files 1 не підтримується на amd64 (py2exe 0.6.9 для Python 2.6 як мінімум)
Joril

2
@Pat: Заклик запустити py2exe - це "python setup.py py2exe". Автоматично додаючи "py2exe" в кінці, це просто означає, що вам не потрібно вводити його в командному рядку.
orlade

2
Не зовсім один виконаний файл, оскільки вам потрібно встановити DLL Microsoft Visual C для виконання .
Кевін Сміт

2
У мене був консольний додаток, який я хотів мати як єдиний виконуваний файл. Я повинен був замінити windows = [{'script': "single.py"}]з console = ['single.py']таким подвійним клацанням файл відкриється у вікні CMD в Windows.
Джефф Б

13

Як згадує інша афіша, py2exe, створить виконуваний файл + деякі бібліотеки для завантаження. Ви також можете мати деякі дані, які потрібно додати до своєї програми.

Наступним кроком є ​​використання інсталятора, щоб упакувати все це в одну просту у використанні програму, що встановлюється / не може бути встановлена.

Я вже кілька років використовую InnoSetup ( http://www.jrsoftware.org/isinfo.php ) із захопленням і для комерційних програм, тому щиро рекомендую його.


+1 для вказівки на те, що після py2exe все ще є речі, які потрібно упакувати.
Хоакін

6

Мені вдалося створити єдиний файл EXE з усіма ресурсами, вбудованими в exe. Я будую на вікнах. щоб пояснити деякі виклики ОС.системи, які я використовую.

Спочатку я спробував перетворити всі свої зображення в бітові, а потім усі мої файли даних у текстові рядки. але це призвело до того, що остаточний exe був дуже великим.

Після гугл протягом тижня я зрозумів, як змінити скрипт py2exe, щоб задовольнити мої потреби.

ось посилання на патч на sourceforge, який я подав, будь ласка, публікуйте коментарі, щоб ми могли включити його до наступного розповсюдження.

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

це пояснює всі внесені зміни, я просто додав нову опцію до лінії настройки. ось мій setup.py.

Я спробую прокоментувати це якнайкраще. Будь ласка, знайте, що мій setup.py є складним, щоб зробити доступ до зображень за назвою файлу. тому я повинен зберігати список, щоб їх відстежувати.

це від заставки, яку я хотів зробити, щоб я намагався зробити.

Я використовую exec для генерації моїх налаштувань під час виконання програми, її програвач легко вирізати та вставити.

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

зламатися

Я хочу звернутися до EXE

icon_resources = значок для EXE

file_resources = файли, які я хочу вставити в програму EXE

other_resources = рядок для вбудовування в exe, у цьому випадку список файлів.

options = py2exe параметри для створення всього в одному файлі EXE

bitmap_strings = список файлів, які слід включити

Зауважте, що file_resources не є дійсною опцією, поки ви не редагуєте файл 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"

Гаразд, це для setup.py тепер потрібна магія доступу до зображень. Я розробив цю програму без py2exe на увазі, потім додав її пізніше. тож ви побачите доступ для обох ситуацій. якщо папку зображень неможливо знайти, вона намагається витягнути зображення з ресурсів exe. код пояснить це. це частина мого класу спрайт, і він використовує directx. але ви можете використовувати будь-яку api, яку ви хочете, або просто отримати доступ до необроблених даних. не має значення.

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, щоб включити якийсь файл у .exe. Я змінив файл build_exe.py, як ви сказали, але коли я заходжу у файл setup.py і пишу, \'file_resources': [('txt2.txt')]він дає мені помилку (файл, який я хочу вимкнути у своєму .exe, називається txt2, і це .txt файл )
VinceLomba

Ви говорили про те, як ви перетворили всі свої зображення в бітові файли, а потім усі файли даних у текстові рядки. Хоча ви сказали, що це робить exe великим, чи це працює, і якщо так, чи можете ви сказати мені, як це зробити? Я знаю, що ця відповідь досить стара, але якщо ви зможете відповісти, це буде вдячно.
Пеппа

4

Ви повинні створити інсталятор, як згадувалося раніше. Незважаючи на те, що також можна дозволити py2exe об'єднати все в один виконуваний файл, встановивши параметр bundle_files на 1, а аргумент ключового слова zipfile - на None, я не рекомендую це для додатків PyGTK.

Це через те, що GTK + намагається завантажити свої файли даних (місцеві жителі, теми тощо) з каталогу, з якого було завантажено. Таким чином, ви повинні переконатися, що каталог вашого виконуваного файлу містить також бібліотеки, які використовуються GTK +, та каталоги lib, share та ін. Під час встановлення GTK +. В іншому випадку у вас виникнуть проблеми із запуском програми на машині, де GTK + не встановлений на всій системі.

Детальніше читайте в моєму посібнику з py2exe для програм PyGTK . Він також пояснює, як поєднати все, але GTK +.


1

Мені кажуть, що bbfreeze створить єдиний файл .EXE і є більш новим, ніж py2exe.


3
Наскільки я можу зрозуміти, bbfreeze не створює однофайлові виконувані файли. Чи можете ви задокументувати свою відповідь?
Хоакін

-1

спробуйте замовити 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.
Пеппа

-2

Нещодавно я використовував py2exe, щоб створити виконуваний файл після огляду для надсилання відгуків на ReviewBoard.

Це був setup.py, який я використовував

from distutils.core import setup
import py2exe

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

Він створив каталог, що містить файл exe та необхідні бібліотеки. Я не думаю, що можна використовувати py2exe, щоб отримати лише один .exe-файл. Якщо вам потрібно, вам потрібно спочатку використовувати py2exe, а потім скористатися якоюсь формою інсталятора, щоб зробити остаточний виконуваний файл.

Варто подбати про те, що всі файли яєць, які ви використовуєте у своїй програмі, потрібно розпакувати, інакше py2exe не може їх включити. Це висвітлено в документах py2exe.


-6

Ні, це не дає вам жодного виконуваного файлу в тому сенсі, що після цього у вас є лише один файл - але у вас є каталог, який містить все необхідне для запуску програми, включаючи файл exe.

Я щойно написав цю програму setup.py . Потрібно лише посилатися python setup.py py2exe.


1
Це не точно. За допомогою правильних параметрів ви можете отримати один окремий файл.
trevorKirkby

@Torsten Marek ... посилання на ваш setup.py мертве. Зокрема .. перші два перенаправляє кінцеві рекламні матеріали. Третій раз він закінчується тут у тупиковій мережі Інтернету.
ZF007
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.