2015-08-11 12 views
33

Questo è un po 'complesso e potrebbe richiedere un po' di tempo.cx-freeze, runpy e multiprocessing - più percorsi al fallimento

Il problema di base è che su linux (Ubuntu nel mio caso di test) una versione cx-freeze del mio programma (Omnitool) non è in grado di creare sottoprocessi. Funziona su Windows 7, tuttavia. O quando si esegue direttamente dal codice sorgente. Sfortunatamente non è così semplice come dimenticare freeze_support.

Il problema

comportamento predefinito di avviare un sottoprocesso, è che il crash del server X. Nello specifico in questo modo:

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) 

Non esiste alcun traceback Python. Ho provato a chiamare manualmente XInitThreads con ctypes, restituisce 0 per l'impostazione corretta, ma si blocca a prescindere. Poco prima dello schianto, l'interfaccia utente di pygame sviene, quindi mi aspetto che ci siano dei difetti.

Ora, impostando multiprocessing.set_start_method() cambia problemi in giro: "forkserver" mi dà questa bella traceback, che mi dice nulla:

Pastebin Example

Impostazione a deporre le uova, invece, rende solo non fare nulla. Il processo inizia e passa attraverso __main__, come posso provare con le stampe, ma non inserisce mai la funzione di destinazione per il sottoprocesso.

Cercando te

Assicurarsi di avere Ubuntu o Linux comparabili con python 3.4. Poi, per ottenere tutte le dipendenze:

Scarica omnitool come zip o clone da git: https://github.com/Berserker66/omnitool requirements.txt nel seguente codice è da 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 

di congelare, eseguire omnisetup.py con l'argomento build.

Ho anche provato a congelare con pyinstallers python 3 fork, che fallisce molto simile. Tuttavia, il file spec non è tracciato git.

+5

Perché vuoi congelarlo per Linux? – Cyphase

+1

Le dipendenze sono difficili da trovare, richiedono la compilazione e molte di queste vengono utilizzate solo durante la compilazione di pygame. Attualmente i miei utenti linux devono fare diversi passaggi in console per far funzionare il mio programma, mentre gli utenti di Windows eseguono semplicemente una configurazione e fanno clic. Mi piacerebbe fornire la stessa comodità a tutti gli utenti. Mi piacerebbe anche sapere personalmente perché questo non funziona e come risolvere, per curiosità. – Berserker

+0

Due dei pacchetti di dipendenze non sono su pip o apt-get. Pygame-3 e pgu. – Berserker

risposta

0

So che probabilmente questo non è ciò che si desidera ascoltare, ma la realtà è che non si sarà mai in grado di avere successo con questo approccio ed ecco perché:

  • Linux non ha portabile pacchetto Python binari, il che significa che un numpy compilato su una distro probabilmente non funzionerà su un altro. Può anche accadere con la stessa distribuzione e versione, solo perché una libreria di sistema ha ricevuto un aggiornamento.
  • manylinux1 si suppone che risolva questo problema ma è davvero difficile creare pacchetti per questo e solo pochi hanno iniziato a utilizzarlo.
  • Il progetto cx-freeze ha avuto l'ultima versione a dicembre 2014, che su scala temporale Python lo colloca come un progetto abbandonato.
+0

Non è presente alcun numpy. PyInstaller ha lo stesso problema, che è ancora attivamente sviluppato. – Berserker

+0

Si noti che sono necessarie più build di librerie python contenenti codice nativo per le varianti 32/64 bit di tutti i sistemi operativi - consultare https://pypi.python.org/pypi/gevent/1.1.2 per un esempio che include build per tutte le versioni supportate versioni python sia per finestre a 32 bit che a 64 bit, così come per OSX e Linux a 64 bit. – danny

1

Ho usato cx_freeze per un progetto al lavoro. Non sono sicuro che questo sia il tuo problema ...ma stavo usando la distribuzione di Anaconda e cx_freeze non stava raccogliendo correttamente i file .dll di cui avevo bisogno per il mio progetto.

La soluzione era quella di:

  1. installare una versione di Python piano
  2. rendere un ambiente con i pacchetti che mi servivano per quel progetto
  3. Run cx_freeze.

Magicamente, tutti i problemi sono andati via e tutto è stato compilato come previsto.

+0

già usando una versione semplice di python – Berserker

0

Bene, il problema che si sta affrontando potrebbe essere dovuto alla mancanza di dipendenze. cx_Freeze hanno alcune dipendenze. Per distribuire il tuo lavoro in python sono disponibili molti pacchetti leggeri. È possibile utilizzare: -

  1. Pyinstaller: può essere installato da

    PIP installare pyinstaller pyinstaller è veramente buono per fare eseguibili con minore dimensione

  2. py2exe