2015-08-11 30 views
33

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:

Pastebin Example

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.

+5

Dlaczego chcesz go zamrozić na Linuksa? – Cyphase

+1

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

+0

Dwa z pakietów zależności nie są na pip lub apt-get. Pygame-3 i pgu. – Berserker

Odpowiedz

0

wiem, że prawdopodobnie nie jest to, co chcesz usłyszeć, ale rzeczywistość jest taka, że ​​nigdy nie będzie w stanie odnieść sukces z tym podejściem a oto dlaczego:

  • Linux nie ma przenośnie pakiet Python binarne, co oznacza, że ​​skompilowany numpy na jednej dystrybucji prawdopodobnie nie będzie działał na innej. Może się nawet zdarzyć w tej samej dystrybucji i wersji, tylko dlatego, że jedna biblioteka systemowa otrzymała aktualizację.
  • manylinux1 ma to rozwiązać, ale naprawdę trudno jest zbudować pakiety dla niego i tylko kilka zaczęło go używać.
  • Projekt cx-freeze miał najnowszą wersję w grudniu 2014 r., Co w skali Pythona stawia go jako projekt opuszczony.
+0

Nie ma żadnych numpy. PyInstaller ma ten sam problem, który jest nadal aktywnie rozwijany. – Berserker

+0

Należy zauważyć, że wiele wersji bibliotek Pythona zawierających natywny kod jest potrzebnych w wersjach 32/64-bitowych wszystkich systemów operacyjnych - patrz https://pypi.python.org/pypi/gevent/1.1.2, aby uzyskać przykład, który zawiera wszystkie obsługiwane wersje wersje python zarówno dla okien 32-bitowych, jak i 64-bitowych, a także dla wersji OSX i 64-bitowego systemu Linux. – danny

1

Użyłem cx_freeze do projektu w pracy. Nie jestem pewien, czy to twój problem ...ale używałem dystrybucji Anaconda, a cx_freeze nie zbierał poprawnie plików .dll, które były mi potrzebne do mojego projektu.

Rozwiązaniem było:

  1. zainstalować wersję płaszczyzny Pythonie
  2. uczynić środowisko z pakietami, że potrzebne do tego projektu
  3. Run cx_freeze.

W magiczny sposób wszystkie problemy zniknęły i wszystko, co zostało skompilowane tak, jak powinno.

+0

już używają zwykłej wersji Pythona – Berserker

0

Cóż, napotkany problem może wynikać z braku zależności. cx_Freeze mają pewne zależności. W celu rozpowszechnienia pracy w Pythonie dostępnych jest wiele lekkich pakietów. można użyć: -

  1. Pyinstaller: może być zainstalowany przez

    pip zainstalować pyinstaller pyinstaller jest naprawdę dobre dla tworzenia plików wykonywalnych z mniejszym rozmiarze

  2. py2exe