Cx-freeze, runpy и многопроцессорность - несколько путей к сбою
Это немного сложный процесс и может занять некоторое время.
Основная проблема заключается в том, что в linux (Ubuntu в моем тестовом примере) версия cx-freeze'd моей программы (Omnitool) не может создавать подпроцессы. Однако он работает на Windows 7. Или при запуске непосредственно из исходного кода. К сожалению, это не так просто, как забыть freeze_support
.
Проблема
Поведение по умолчанию при запуске подпроцесса заключается в том, что X Server выйдет из строя. В частности:
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)
Нет трассировки питона. Я попытался вручную вызвать XInitThreads
с помощью ctypes, он возвращает 0 для успешной установки, но сработает независимо. Коротышка перед сбоем, пользовательский интерфейс pygame вылетает, поэтому я ожидаю, что что-то не так.
Теперь установка multiprocessing.set_start_method()
меняет проблемы:
"forkserver" дает мне эту прекрасную трассировку, которая ничего мне не говорит:
Пример Pastebin
Установив его вместо spawn, он просто не делает ничего. Процесс начинается и проходит через __main__
, как я могу доказать с помощью отпечатков, но никогда не входит в целевую функцию для подпроцесса.
Попытка
Убедитесь, что у вас Ubuntu или сопоставимый Linux с python 3.4.
Затем, чтобы получить все зависимости:
Загрузите omnitool как zip или clone из git:
https://github.com/Berserker66/omnitool
Требования .txt в следующем коде от 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
Чтобы заморозить, запустите omnisetup.py
с аргументом build
.
Я также пробовал замораживать с помощью вилки python 3 pyinstallers 3, которая не очень похожа. Файл spec не отслеживается git.
Ответы
Ответ 1
Я знаю, что, вероятно, это не то, что вы хотите услышать, но реальность такова, что вы никогда не сможете добиться успеха в этом подходе, и вот почему:
- Linux не имеет переносимых пакетов Python, что означает, что скомпилированный numpy на одном дистрибутиве, вероятно, не будет работать на другом. Это может произойти с одним и тем же дистрибутивом и версией, только потому, что одна системная библиотека получила обновление.
- manylinux1 должен решить эту проблему, но на самом деле сложно создавать пакеты для него, и лишь немногие начали использовать его.
- Проект cx-freeze имел последний выпуск в декабре 2014 года, который по шкале времени Python ставит его как заброшенный проект.
Ответ 2
Я использовал cx_freeze для проекта на работе. Я не уверен, что это ваша проблема... но я использовал дистрибутив Anaconda, а cx_freeze не собирал должным образом DLL, который мне нужен для моего проекта.
Решение заключалось в следующем:
- Установить версию Python на плоскости
- создать среду с пакетами, которые мне нужны для этого проекта
- Запустите cx_freeze.
Волшебно, все проблемы исчезли, и все скомпилировано, как и предполагалось.
Ответ 3
Ну, проблема, с которой вы сталкиваетесь, может быть связана с отсутствием зависимостей.
cx_Freeze имеют некоторые зависимости.
Чтобы распространять вашу работу на python, многие легкие пакеты доступны.
Вы можете использовать: -