Это немного сложный процесс и может занять некоторое время.
Основная проблема заключается в том, что в 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" дает мне эту прекрасную трассировку, которая ничего мне не говорит:
Установив его вместо 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.