Вопрос

мне показалось, что я это услышал py2exe смог это сделать, но так и не понял.Кто-нибудь успешно сделал это?Могу ли я увидеть ваш файл setup.py и какие параметры командной строки вы использовали?

По сути, я думаю о том, чтобы получить один исполняемый файл, который что-то вроде разархивирует себя в /temp и запускается.

Это было полезно?

Решение

PyInstaller создаст один файл .exe без каких-либо зависимостей;использовать --onefile вариант.Он делает это, упаковывая все необходимые общие библиотеки в исполняемый файл и распаковывая их перед запуском, как вы описываете (EDIT:py2exe также имеет эту функцию, см. ответ Минти)

Я использую версию PyInstaller от svn, так как последний релиз (1.3) несколько устарел.Это работает очень хорошо для приложения, которое зависит от PyQt, PyQwt, numpy, scipy и некоторых других.

Другие советы

Способ сделать это с помощью py2exe — использовать параметр Bundle_files в файле setup.py.Для одного файла вы захотите установить bundle_files до 1, compressed значение True и установите для параметра zipfile значение None.Таким образом, он создает один сжатый файл для удобства распространения.

Вот более полное описание опции Bundle_file, указанное непосредственно в сайт py2exe*

Использование «bundle_files» и «zipfile»

Более простым (и лучшим) способом создания однолетних исполняемых файлов является установка Bundle_files на 1 или 2 и установить на Zipfile на нет.Этот подход не требует извлечения файлов во временное место, которое обеспечивает гораздо более быстрый запуск программы.

Допустимые значения для Bundle_files:

  • 3 (по умолчанию) не объединять
  • 2. Соберите все, кроме интерпретатора Python.
  • 1 пакет всего, включая интерпретатор Python

Если Zipfile не установлен ни на нет, файлы будут объединяться в исполняемом файле вместо 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,
)

Как упоминалось в другом постере, py2exe сгенерирует исполняемый файл + несколько библиотек для загрузки.Вы также можете добавить некоторые данные в свою программу.

Следующий шаг — использовать установщик, чтобы упаковать все это в одну простую в использовании программу, которую можно установить или удалить.

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

Как упоминалось ранее, вам следует создать установщик.Хотя также возможно позволить py2exe объединить все в один исполняемый файл, установив для параметра Bundle_files значение 1, а для аргумента ключевого слова zipfile — значение None, я не рекомендую это для приложений PyGTK.

Это связано с тем, что GTK+ пытается загрузить свои файлы данных (локальные файлы, темы и т. д.) из каталога, из которого он был загружен.Поэтому вам необходимо убедиться, что каталог вашего исполняемого файла содержит также библиотеки, используемые GTK+, а также каталоги lib,share и т. д. из вашей установки GTK+.В противном случае у вас возникнут проблемы с запуском вашего приложения на машине, где GTK+ не установлен общесистемно.

Подробности читайте в моем руководство по py2exe для приложений PyGTK.Здесь также объясняется, как объединить все, кроме GTK+.

Мне удалось создать один exe-файл со всеми ресурсами, встроенными в exe.Я строю на окнах.так что это объяснит некоторые вызовы os.system, которые я использую.

Сначала я попытался преобразовать все изображения в растровые изображения, а затем все файлы данных в текстовые строки.но из-за этого окончательный 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])

авария

script = py скрипт, который я хочу превратить в 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!")

Любые вопросы можно было задавать.

Мне сказали bbfreeze создаст один файл .EXE, новее, чем py2exe.

пытатьсяc_x заморозитьон может создать хороший автономный

Недавно я использовал py2exe для создания исполняемого файла для пост-ревью для отправки обзоров в ReviewBoard.

Это был файл setup.py, который я использовал

from distutils.core import setup
import py2exe

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

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

Следует позаботиться о том, чтобы все файлы egg, которые вы используете в своем приложении, должны быть разархивированы, иначе py2exe не сможет их включить.Это описано в документации py2exe.

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

я только что написал этот setup.py сегодня.Вам нужно только вызвать python setup.py py2exe.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top