To jest trochę skomplikowane i może zająć trochę czasu.Cx-Freeze, Runpy i Multiprocessing - wiele ścieżek do awarii
Podstawowym problemem jest to, że w systemie Linux (Ubuntu w moim przypadku testowym) wersja mojego programu (Omnitool) w wersji cx-freeze nie może tworzyć podprocesów. Działa jednak na Windows 7. Lub podczas uruchamiania bezpośrednio z kodu źródłowego. Niestety nie jest tak proste, jak zapomnienie freeze_support
.
Problem
domyślne zachowanie począwszy podproces jest to, że awarie X Server. W szczególności tak:
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)
Nie ma śledzenia Pythona. Próbowałem ręcznie wywołać XInitThreads
z ctypes, zwraca 0 dla pomyślnego ustawienia, ale zawiesza się niezależnie. Shorty przed awarią, pygame UI buga się, więc spodziewam się, że coś jest wadą.
Teraz ustawienie multiprocessing.set_start_method()
zmienia problemy wokół: „forkserver” daje mi ten piękny traceback, że mi nic nie mówi:
ustawienie go na tarło, zamiast, po prostu sprawia, że nic nie robić. Proces rozpoczyna się i przechodzi przez __main__
, co mogę udowodnić za pomocą odbitek, ale nigdy nie wchodzę w funkcję celu podprocesu.
Próbuje sobie
Upewnij się, że Ubuntu Linux lub porównywalną z Pythona 3.4. Następnie, aby uzyskać wszystkie zależności:
Pobierz omnitool jako ZIP lub klonu z git: https://github.com/Berserker66/omnitool requirements.txt w poniższym kodzie jest od 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
Aby zatrzymać, uruchomić omnisetup.py
z build
argument.
Próbowałem również zamrażania z pyinstallerów python 3 widelec, który nie powiedzie się bardzo podobne. Plik spec nie jest jednak śledzony git.
Dlaczego chcesz go zamrozić na Linuksa? – Cyphase
Zależności są trudne do zdobycia, wymagają kompilacji, a wiele z nich jest używanych tylko podczas kompilacji pygame. Obecnie moi użytkownicy Linuxa muszą wykonać kilka kroków w konsoli, aby mój program działał, podczas gdy użytkownicy Windows po prostu uruchamiają instalację i klikają. Chciałbym zapewnić tę samą wygodę wszystkim użytkownikom. Chciałbym również osobiście dowiedzieć się, dlaczego to się nie udaje i jak rozwiązać, ze względu na ciekawość. – Berserker
Dwa z pakietów zależności nie są na pip lub apt-get. Pygame-3 i pgu. – Berserker