2011-10-09 18 views
7

Soy un programador de Python y estoy tratando de construir un binario ejecutable para distribuir mi software a mis clientes, incluso si no es completamente ejecutable. Quiero poder distribuir mi software en una manera que sea conveniente para el usuario final.Python - Problemas para construir el ejecutable

Ya he probado PyInstaller así como Py2Exe y estoy enfrentando el mismo problema con un software en particular.

Utilicé el módulo splinter para mi programa (que por supuesto es un nuevo marco de alto nivel para interactuar con otros frameworks como Selenium) y cada vez que intento compilarlo, parece que hay un archivo llamado "webdriver.xpi" eso siempre queda fuera del paquete final y, por lo tanto, cuando el programa intenta ejecutar el controlador web, falla con un error de IO que indica que el archivo "webdriver.xpi" no se encontró ... pero aparte de eso, la GUI y todo funciona perfectamente bien.

¿Hay alguna manera de incluirlo incluso de forma manual? Intenté incluirlo manualmente navegando a la carpeta específica @ library.zip pero no funcionó.

No soy realmente un experto en este asunto y confío en GUI2Exe para construir todo ... y realmente agradecería algunos consejos sobre cómo solucionar esto.

Gracias.

+0

puedo mostrar la secuencia de comandos que setup.py utilizado para py2exe? – chown

+0

¿No puede simplemente agregar el archivo al directorio de la aplicación antes de ejecutarlo? – Fenikso

Respuesta

1

Necesita una instrucción en su setup.py para incluir cualquier archivo de recursos en su distribución. Hay un par de maneras de hacerlo (consulte distutils, setuptools, distribute, dependiendo de lo que esté usando para compilar su distribución), pero el wiki py2exe tiene un example.

Puede necesitar usar this py2exe tip para encontrar sus recursos si los está instalando en el mismo directorio que su exe.

Consulte this answer para obtener información adicional sobre cómo incluir los archivos de recursos en su distribución.

10

Estuve en esto todo el día y encontré una solución, es astuto pero funciona. En el mensaje de error que estaba recibiendo noté que había un espacio entre en la biblioteca .zip. No pude localizarlo en el código fuente de py2exe o selenio. Yo también había intentado poner el archivo xpi en el archivo zip de la biblioteca y no funcionó. La solución es:

  1. En el archivo de configuración utilizar estas opciones:

    setup(
        console=['yourFile.py'], 
        options={ 
          "py2exe":{ 
            "skip_archive": True, 
            "unbuffered": True, 
            "optimize": 2 
          } 
        } 
    ) 
    
  2. Run el py2exe instalar

  3. Copia el archivo XPI en el directorio dist

Eso Deberías hacerlo.

+1

Estoy de acuerdo con aknatn, he encontrado la solución a este problema hace mucho tiempo, pero olvidé por completo que publiqué la pregunta aquí. La solución principal es cualquier cosa que hagas, incluso con un generador de interfaz gráfica de usuario como GUI2Exe, solo asegúrate de que el paquete final no esté comprimido ni nada y todo esté desempaquetado en una carpeta a la que puedas agregar el archivo .xpi manualmente y hacerlo funcionar. Más tarde utilicé algo así como NSIS para empaquetarlo en un fantástico asistente de instalación con acuerdos de licencia, archivos clave, etc. para distribuirlo a terceros. Debo decir que aprendí mucho de perder el tiempo tratando de hacer que Python funcione :) –

+0

Gracias, ¿qué tal un voto arriba ;-) – aknatn

+0

Jaja, lo intenté ... dice que Vote Up requiere 15 reputación xD –

0

Sé que esto es antiguo, pero quería dar una respuesta actualizada para evitar sugerir que los programadores hagan algo de forma manual.

Hay una opción py2exe para especificar una lista de archivos de datos como tuplas.(pathtocopyto, [list of files and where to get them])

Ejemplo:

from disutils.core import setup 
import py2exe 

wd_base = 'C:\\Python27\\Lib\\site-packages\\selenium\\webdriver' 
RequiredDataFailes = [ 
    ('selenium/webdriver/firefox', ['%s\\firefox\\webdriver.xpi'%(wd_base), '%s\\firefox\\webdriver_prefs.json'%(wd_base)]) 
] 

setup(
    console=['MyScript.py'], 
    data_files=RequiredDataFiles, 
    options={ 
     **mypy2exeopts 
    } 
) 

El único inconveniente que estoy al tanto de la actualidad es que todavía se necesita skip_archive = True. Hay soluciones para obtener los archivos de datos en library.zip, pero no he tenido mucha suerte con la información del webdriver.

1

Aquí es una solución de su pregunta: Tengo modificar un poco de código y debe ser un trabajo ya que tenía un mismo tema y lo resolví:

from distutils.core import setup 
import py2exe 

wd_base = 'C:\\Python27\\Lib\site-packages\\selenium-2.44.0-py2.7.egg \\selenium\\webdriver' 
RequiredDataFailes = [ 
('selenium/webdriver/firefox', ['%s\\firefox\\webdriver.xpi'%(wd_base), '%s\\firefox\\webdriver_prefs.json'%(wd_base)]) 
] 

setup(
windows=[{"script":"gui_final.py"}],options={"py2exe":{"skip_archive": True,"includes":["sip"]}}, 
data_files=RequiredDataFailes, 

) 
+0

cuando probé su secuencia de comandos escupe un error con respecto a sorbo. ser no definido o desconocido –

Cuestiones relacionadas