这有点复杂,可能要花一些时间。
基本问题是,在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。
解决方案是:
不可思议的是,所有问题都消失了,一切都按原样进行了编译。