Pregunta

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

Básicamente, estoy pensando en darme un único archivo ejecutable que haga algo como descomprimirse en tal vez /temp y ejecutarse.

¿Fue útil?

Solución

PyInstaller creará un único archivo .exe sin dependencias;utilizar el --onefile opción.Para ello, empaqueta todas las bibliotecas compartidas necesarias en el ejecutable y las descomprime antes de que se ejecute, tal como lo describe (EDITAR:py2exe también tiene esta característica, consulte la respuesta de menta)

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

Otros consejos

La forma de hacer esto usando py2exe es usar la opción bundle_files en su archivo setup.py.Para un solo archivo querrás configurar bundle_files a 1, compressed en Verdadero y establezca la opción de archivo zip en Ninguno.De esa manera crea un archivo comprimido para una fácil distribución.

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

Usando "bundle_files" y "zipfile"

Una forma más fácil (y mejor) de crear ejecutables de un solo archivo es establecer Bundle_Files en 1 o 2, y configurar ZipFile en ninguno.Este enfoque no requiere extraer archivos a una ubicación temporal, que proporciona un inicio del programa mucho más rápido.

Los valores válidos para bundle_files son:

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

Si ZipFile está configurado en ninguno, los archivos se agruparán dentro del ejecutable en lugar de biblioteca.zip.

Aquí hay un ejemplo 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,
)

Como menciona el 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 utilizar un instalador para empaquetar todo esto en un programa instalable/desinstalable fácil de usar.

He usado InnoSetup ( http://www.jrsoftware.org/isinfo.php ) con mucho gusto desde hace varios años y para programas comerciales, por lo que lo recomiendo de todo corazón.

Debes crear un instalador, como se mencionó anteriormente.Aunque también es posible permitir que py2exe agrupe todo en un solo ejecutable, configurando la opción bundle_files en 1 y el argumento de la palabra clave zipfile en Ninguno, no recomiendo esto para aplicaciones PyGTK.

Esto 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 ejecutable contenga también las bibliotecas utilizadas por GTK+ y los directorios lib, share, etc. de su instalación de GTK+.De lo contrario, tendrá problemas al ejecutar su aplicación en una máquina donde GTK+ no esté instalado en todo el sistema.

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

Pude crear un único archivo exe con todos los recursos integrados en el exe.Estoy construyendo sobre Windows.Eso explicará algunas de las llamadas a os.system 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 provocó que el archivo ejecutable final fuera muy, muy grande.

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

Aquí está el enlace de parche en SourceForge que envié, por favor 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 agregué una nueva opción a la línea de configuración.aquí está mi setup.py.

Intentaré comentarlo lo mejor que pueda.Tenga en cuenta que mi setup.py es complejo debido al hecho de que accedo a las imágenes por nombre de archivo.entonces debo almacenar una lista para realizar un seguimiento de ellos.

Esto es de un protector de pantalla que estaba intentando hacer.

Utilizo exec para generar mi configuración en tiempo de ejecución, es más fácil cortar y pegar así.

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

descomponer

script = py script quiero convertirlo en un exe

icon_resources = el icono del 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.

opciones = 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 intento publicar un código en este sitio, si me equivoco, no me llames.

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 todo para el setup.py, ahora la magia necesitaba acceder a las imágenes.Desarrollé esta aplicación sin py2exe en mente y luego la agregué.entonces verás el acceso para ambas situaciones.Si no se puede encontrar la carpeta de imagen, intenta extraer las imágenes de los recursos EXE.el código lo explicará.Esto es parte de mi clase de sprites y usa directx.pero puedes usar cualquier API que quieras o simplemente acceder a los datos sin procesar.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 duda no dudes en preguntar.

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

intentarc_x congelarpuede crear un buen independiente

Recientemente utilicé py2exe para crear un ejecutable de revisión posterior para enviar reseñas a ReviewBoard.

Este fue el setup.py que usé

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 un solo archivo .exe.Si necesita eso, primero deberá usar py2exe y luego usar algún tipo de instalador para crear el ejecutable final.

Una cosa que debe tener en cuenta es que todos los archivos egg que utilice en su aplicación deben descomprimirse; de ​​lo contrario, py2exe no podrá incluirlos.Esto se trata en los documentos de py2exe.

No, no le proporciona un único 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.Sólo necesitas invocar python setup.py py2exe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top