python - cx-freeze, runpy y multiproceso: mĂșltiples rutas hacia la falla
ubuntu multiprocessing (3)
Bueno, el problema al que se enfrenta puede deberse a la falta de dependencias. cx_Freeze tiene algunas dependencias. Para distribuir tu trabajo en python, muchos paquetes livianos son avalibles. Puedes usar:-
Pyinstaller: puede ser instalado por
pip install pyinstaller pyinstaller es realmente bueno para hacer ejecutables con menos tamaño
Py2exe
Este es un poco complejo, y puede tomar algo de su tiempo.
El problema básico es que en linux (Ubuntu en mi caso de prueba) una versión de mi programa congelada (Omnitool) no es capaz de crear subprocesos. Sin embargo, funciona en Windows 7. O cuando se ejecuta directamente desde el código fuente. Lamentablemente, no es tan simple como olvidar freeze_support
.
El problema
El comportamiento predeterminado de iniciar un subproceso es que el Servidor X se cuelga. Específicamente así:
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 23 requests (23 known processed) with 0 events remaining.
[xcb]Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
Omnitool: ../../src/xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost'' failed.
Aborted (core dumped)
No hay rastreo de python. Intenté llamar manualmente a XInitThreads
con ctypes, devuelve 0 para establecer con éxito, pero se bloquea independientemente. Poco antes del accidente, la interfaz de usuario del pygame falla, así que espero que algo falle.
Ahora, al establecer multiprocessing.set_start_method()
modifican los problemas: "forkserver" me da este precioso rastreo, que no me dice nada:
Configurarlo para generar, en cambio, solo hace que no haga nada. El proceso comienza, y pasa __main__
, como puedo comprobar con impresiones, pero nunca ingresa a la función objetivo para el subproceso.
Probándose
Asegúrate de tener Ubuntu o Linux comparable con Python 3.4. Luego, para obtener todas las dependencias:
Descargar omnitool como zip o clonar de git: https://github.com/Berserker66/omnitool requirements.txt en el siguiente código es de Omnitool.
sudo apt-get update -qq
sudo apt-get install --fix-missing mercurial subversion python3-dev python3-numpy libav-tools libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsmpeg-dev libsdl1.2-dev libportmidi-dev libswscale-dev libavformat-dev libavcodec-dev python3-pip
pip3 install -r requirements.txt
pip3 install cx_Freeze
Para congelar, ejecute omnisetup.py
con el argumento de build
.
También he intentado congelar con pyinstallers pitón 3 tenedor, que falla muy similar. Sin embargo, el archivo de especificación no tiene git tracking.
Sé que probablemente esto no es lo que quieres escuchar, pero la realidad es que nunca podrás tener éxito con este enfoque y aquí está el por qué:
- Linux no tiene binarios de paquetes Python portátiles, lo que significa que un numpy compilado en una distribución probablemente no funcionará en otro. Incluso puede suceder con la misma distribución y versión, simplemente porque una biblioteca del sistema recibió una actualización.
- Se supone que manylinux1 resuelve esto, pero es muy difícil crear paquetes para él y solo unos pocos comenzaron a usarlo.
- El proyecto cx-freeze tuvo su último lanzamiento en diciembre de 2014, que en Python Timescale lo pone como un proyecto abandonado.
Usé cx_freeze para un proyecto en el trabajo. No estoy seguro de si este es su problema ... pero estaba usando la distribución de Anaconda, y cx_freeze no estaba recopilando correctamente los archivos .dll que necesitaba para mi proyecto.
La solución fue:
- Instalar una versión plana de Python
- crear un entorno con los paquetes que necesitaba para ese proyecto
- Ejecute cx_freeze.
Mágicamente, todos los problemas desaparecieron y todo se compiló como se suponía también.