【发布时间】:2015-11-03 18:16:35
【问题描述】:
这有点复杂,可能需要您花费一些时间。
基本问题是,在 linux(我的测试用例中是 Ubuntu)上,我的程序(Omnitool)的 cx-freeze 版本无法创建子进程。但是,它适用于 Windows 7。或者直接从源代码运行时。不幸的是,这并不像忘记freeze_support那么简单。
问题
启动子进程的默认行为是 X 服务器崩溃。具体是这样的:
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)
没有python回溯。我尝试使用 ctypes 手动调用 XInitThreads,它返回 0 表示成功设置,但无论如何都会崩溃。崩溃前不久,pygame UI 出现错误,所以我预计那里有问题。
现在,设置 multiprocessing.set_start_method() 可以改变以下问题:
“forkserver”给了我这个可爱的回溯,它什么也没告诉我:
相反,将其设置为产卵只会使其不执行任何操作。进程开始,并通过__main__,正如我可以通过打印证明的那样,但从未进入子进程的目标函数。
尝试自己
确保你有 Ubuntu 或类似的 Linux 和 python 3.4。 然后获取所有依赖项:
以 zip 格式下载 omnitool 或从 git 克隆: https://github.com/Berserker66/omnitool 以下代码中的 requirements.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
要冻结,请使用 build 参数运行 omnisetup.py。
我也尝试过使用 pyinstallers python 3 fork 进行冻结,结果非常相似。规范文件没有被 git 跟踪。
【问题讨论】:
-
为什么要为 Linux 冻结它?
-
依赖项很难获得,涉及编译,其中许多仅在 pygame 编译期间使用。目前,我的 linux 用户必须在控制台中执行几个步骤才能使我的程序正常工作,而 Windows 用户只需运行设置并单击即可。我想为所有用户提供同样的便利。出于好奇,我个人也想知道为什么会失败以及如何解决。
-
两个依赖包不在 pip 或 apt-get 上。 Pygame-3 和 pgu。
-
嗯 - 至少你不是唯一一个看到症状的人 - 请参阅 bugs.launchpad.net/ubuntu/+source/apport/+bug/1024202 和所有重复的错误。当我能拿到一个 Ubuntu 盒子时,我会试着看看它。出于兴趣,您是否在非基于 Debian 的 linux 上尝试过?
-
没有,目前只有ubuntu和xubuntu
标签: python ubuntu multiprocessing python-3.4 cx-freeze