Pregunta

Estoy usando Pyinstaller para convertir dos scripts en un archivo ejecutable, uno de los cuales llama al otro. El problema que tengo es que no puedo entender cómo agrupar los dos scripts y aún así dejar que se referencien entre sí:

El código que causa el problema es que un script, script1.py contiene:

subprocess.call(['gksudo','python script2.py'])

Esto funciona bien cuando ejecuto los guiones normalmente, pero una vez que están empaquetados en Pyinstaller, no sé cómo hacer que la llamada funcione.

¿Fue útil?

Solución

No creo que Pyinstaller pueda manejar este tipo de agrupación por sí mismo, al menos no logré configurarlo si es posible. También tengo una aplicación bastante grande donde algunas llamadas a

subprocess.popen ('Python' ...)

están hechos. La forma en que finalmente lo hice funcionar fue:

  1. Modifique sus llamadas de subprocesos a una pitón diferente, como subprocess.call(['gksudo','./python script2.py']). Cree dos análisis separados, uno para el punto de entrada y otro para el resto de los scripts, en su caso:

    A1 - Análisis de script1.py A2 - Análisis de script2.py

  2. Cree el EXE solo a partir de los scripts del punto de entrada:

    pyz = PYZ(a1.pure)
    exe = EXE(pyz,
      a1.scripts,
      exclude_binaries=1,
      name={name here},
      debug=False,
      strip=False,
      upx=True,
      console=1 )
    
  3. Recopilar de todos los guiones

        coll = COLLECT( exe,
           a1.binaries,
           a1.zipfiles,
           a1.datas,
           a2.binaries,
           a2.zipfiles,
           a2.datas,
       python_tree, 
           *additional_trees,
           strip=False,
           upx=True,
           name={})
    
  4. Copie Python en su distribución en la ubicación que se especificó en todas las llamadas de subprocesos con cualquier requisito adicional que Pyinstaller no encontró (tenía algunos como matplotlib, pylab, etc.)

  5. Cree un script de inicio que primero cambie las variables Enviromentales requeridas para apuntar a su paquete y luego iniciar la aplicación. En mi caso, lo que se necesitaba fue, desde el directorio de llamadas:

     export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
     export LD_RUN_PATH=`pwd`:$LD_RUN_PATH
    

Ahora, todo esto era necesario si quería que la aplicación se ejecutara en máquinas que no tenían Python instalado, o si tienen instalado Python, asegúrese de que la aplicación todavía use todas las bibliotecas del paquete de distribución en lugar de cualquier biblioteca local. Si en su caso, Python ya está instalado en máquinas de destino, no creo que sea necesario algo así y los primeros 3 pasos serían suficientes.

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