这有点复杂,可能要花一些时间。

基本问题是,在Linux(我的测试用例中为Ubuntu)上,我的程序的Cx冻结版本(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)

没有python追溯。我尝试使用ctypes手动调用XInitThreads,成功设置返回0,但无论如何都会崩溃。崩溃之前不久,pygame UI出现错误,因此我希望那里出现故障。

现在,设置multiprocessing.set_start_method()可以解决以下问题:
“forkserver”给了我这个可爱的回溯,它什么也没告诉我:

Pastebin Example

将其设置为产生,只会使其不执行任何操作。正如我可以通过打印所证明的那样,该过程开始并经过__main__,但从未输入该子过程的目标函数。

尝试自己

确保您具有带有python 3.4的Ubuntu或类似的Linux。
然后获取所有依赖项:

从zip下载omnitool或从git下载omnitool:
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

要冻结,请使用omnisetup.py参数运行build

我也尝试使用pyinstallers python 3 fork冻结,但失败非常相似。规范文件不是git跟踪的。

最佳答案

我在工作中的项目中使用了cx_freeze。我不确定这是否是您的问题...但是我使用的是Anaconda发行版,而cx_freeze没有正确收集我的项目所需的.dll。

解决方案是:

  • 安装Python的平面版本
  • 用该项目
  • 需要的软件包创建环境
  • 运行cx_freeze。

  • 不可思议的是,所有问题都消失了,一切都按原样进行了编译。

    08-07 17:00