Подтвердить что ты не робот

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.

4b9b3361

Ответ 1

Я знаю, что, вероятно, это не то, что вы хотите услышать, но реальность такова, что вы никогда не сможете добиться успеха в этом подходе, и вот почему:

  • Linux не имеет переносимых пакетов Python, что означает, что скомпилированный numpy на одном дистрибутиве, вероятно, не будет работать на другом. Это может произойти с одним и тем же дистрибутивом и версией, только потому, что одна системная библиотека получила обновление.
  • manylinux1 должен решить эту проблему, но на самом деле сложно создавать пакеты для него, и лишь немногие начали использовать его.
  • Проект cx-freeze имел последний выпуск в декабре 2014 года, который по шкале времени Python ставит его как заброшенный проект.

Ответ 2

Я использовал cx_freeze для проекта на работе. Я не уверен, что это ваша проблема... но я использовал дистрибутив Anaconda, а cx_freeze не собирал должным образом DLL, который мне нужен для моего проекта.

Решение заключалось в следующем:

  • Установить версию Python на плоскости
  • создать среду с пакетами, которые мне нужны для этого проекта
  • Запустите cx_freeze.

Волшебно, все проблемы исчезли, и все скомпилировано, как и предполагалось.

Ответ 3

Ну, проблема, с которой вы сталкиваетесь, может быть связана с отсутствием зависимостей. cx_Freeze имеют некоторые зависимости. Чтобы распространять вашу работу на python, многие легкие пакеты доступны. Вы можете использовать: -

  • Pyinstaller: его можно установить с помощью

    pip install pyinstaller pyinstaller действительно хорош для создания исполняемых файлов с меньшим размером

  • py2exe