tutorial tuple indexerror index cx_freeze compile python packaging py2exe

python - tuple - py2exe tutorial



py2exe-genera un solo archivo ejecutable (9)

Creí haber escuchado que py2exe fue capaz de hacer esto, pero nunca lo descubrí. ¿Alguien ha hecho esto con éxito? ¿Puedo ver su archivo setup.py y las opciones de línea de comando que utilizó?

Básicamente, estoy pensando en darme un solo archivo ejecutable que hace algo como descomprimir a maybe / temp y ejecuta.


Como la mención del otro cartel, py2exe, generará un ejecutable + algunas bibliotecas para cargar. También puede tener algunos datos para agregar a su programa.

El siguiente paso es usar un instalador, para empaquetar todo esto en un programa fácil de usar instalable / no seleccionable.

He utilizado InnoSetup ( http://www.jrsoftware.org/isinfo.php ) con deleite por varios años y para programas comerciales, así que lo recomiendo encarecidamente.


Debe crear un instalador, como se mencionó anteriormente. Aunque también es posible permitir que py2exe agrupe todo en un único ejecutable, estableciendo la opción bundle_files en 1 y el argumento de la palabra clave zipfile en None, no lo recomiendo para las aplicaciones PyGTK.

Eso se debe a que GTK + intenta cargar sus archivos de datos (locales, temas, etc.) desde el directorio desde el que se cargó. Por lo tanto, debe asegurarse de que el directorio de su archivo ejecutable contenga también las bibliotecas utilizadas por GTK + y los directorios lib, share y etc. de su instalación de GTK +. De lo contrario, tendrá problemas para ejecutar su aplicación en una máquina donde GTK + no está instalado en todo el sistema.

Para más detalles, lea mi guía de py2exe para aplicaciones PyGTK . También explica cómo agrupar todo, pero GTK +.


La forma de hacerlo utilizando py2exe es usar la opción bundle_files en su archivo setup.py. Para un solo archivo, deseará establecer bundle_files en 1, compressed en True y establecer la opción de archivo zip en Ninguno. De esta forma, crea un archivo comprimido para facilitar la distribución.

Aquí hay una descripción más completa de la opción bundle_file que se cita directamente del sitio py2exe *

Usando "bundle_files" y "zipfile"

Una manera más fácil (y mejor) de crear archivos ejecutables de un solo archivo es establecer bundle_files en 1 o 2 y establecer zipfile en None. Este enfoque no requiere extraer archivos a una ubicación temporal, lo que proporciona un inicio de programa mucho más rápido.

Los valores válidos para bundle_files son:

  • 3 (predeterminado) no agrupar
  • 2 paquete todo menos el intérprete de Python
  • 1 paquete todo, incluido el intérprete de Python

Si zipfile está establecido en None, los archivos se agruparán en el ejecutable en lugar de library.zip.

Aquí hay una muestra de 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, )


Me dijeron que bbfreeze creará un único archivo .EXE, y es más nuevo que py2exe.


No, no le da un solo ejecutable en el sentido de que solo tiene un archivo después, pero tiene un directorio que contiene todo lo que necesita para ejecutar su programa, incluido un archivo exe.

Acabo de escribir este setup.py hoy. Solo necesita invocar python setup.py py2exe .


Pude crear un solo archivo exe con todos los recursos incrustados en el exe. Estoy construyendo en Windows. entonces eso explicará algunas de las llamadas al sistema operativo que estoy usando.

Primero intenté convertir todas mis imágenes en bitmats y luego todos mis archivos de datos en cadenas de texto. pero esto causó que el exe final fuera muy grande.

Después de buscar en Google durante una semana, descubrí cómo alterar el script py2exe para satisfacer mis necesidades.

aquí está el enlace del parche en sourceforge que envié, publique comentarios para que podamos incluirlo en la próxima distribución.

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

esto explica todos los cambios realizados, simplemente he agregado una nueva opción a la línea de configuración. aquí está mi setup.py

Trataré de comentarlo lo mejor que pueda. Por favor, sepan que mi setup.py es complejo al hecho de que tengo acceso a las imágenes por nombre de archivo. así que debo almacenar una lista para hacer un seguimiento de ellos.

esto es de un protector de pantalla de querer-a-b que estaba tratando de hacer.

Uso exec para generar mi configuración en tiempo de ejecución, es más fácil de cortar y pegar de esa manera.

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

Descompostura

script = script py quiero convertirme en un exe

icon_resources = el ícono para el exe

file_resources = archivos que quiero incrustar en el exe

other_resources = una cadena para incrustar en el exe, en este caso una lista de archivos.

options = opciones de py2exe para crear todo en un archivo exe

bitmap_strings = una lista de archivos para incluir

Tenga en cuenta que file_resources no es una opción válida hasta que edite su archivo py2exe.py como se describe en el enlace anterior.

La primera vez que intenté publicar el código en este sitio, si lo hago mal no me llame.

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, eso es para setup.py ahora la magia necesitaba acceder a las imágenes. Desarrollé esta aplicación sin py2exe en mente y luego la agregué más tarde. entonces verás acceso para ambas situaciones. si no se puede encontrar la carpeta de la imagen, intenta extraer las imágenes de los recursos del programa exe. el código lo explicará. esto es parte de mi clase sprite y usa un directx. pero puede usar cualquier API que desee o simplemente acceder a los datos brutos. no importa

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

Cualquier pregunta no tuvo problemas para preguntar.


Recientemente utilicé py2exe para crear un archivo ejecutable para revisión posterior para enviar revisiones a ReviewBoard.

Esta fue la configuración.py que utilicé

from distutils.core import setup import py2exe setup(console=[''post-review''])

Creó un directorio que contiene el archivo exe y las bibliotecas necesarias. No creo que sea posible usar py2exe para obtener solo un archivo .exe. Si lo necesita, primero deberá usar py2exe y luego usar alguna forma de instalador para hacer el ejecutable final.

Una cosa de la que debes ocuparte es que los archivos de huevos que uses en tu aplicación deben descomprimirse, de lo contrario, py2exe no podrá incluirlos. Esto está cubierto en los documentos py2exe.



PyInstaller creará un único archivo .exe sin dependencias; use la opción --onefile . Lo hace empaquetando todas las librerías compartidas necesarias en el ejecutable, y desempaquetarlas antes de que se ejecute, tal como lo describe (EDIT: py2exe también tiene esta característica, vea la respuesta de minty )

Utilizo la versión de PyInstaller de svn, ya que la última versión (1.3) está un poco desactualizada. Ha funcionado muy bien para una aplicación que depende de PyQt, PyQwt, numpy, scipy y algunos más.