这有点复杂,可能需要一些时间。
基本问题是,在Linux上(在我的测试用例中是Ubuntu)我的程序(Omnitool)的cx-freeze'd版本无法创建子进程。但它适用于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,但无论如何崩溃。在崩溃之前Shorty,pygame UI漏掉了,所以我希望有一些错误。
现在,设置multiprocessing.set_start_method()
会改变问题:
“forkserver”给了我这个可爱的追溯,它什么也没告诉我:
将其设置为spawn,只是让它不做任何事情。该过程开始,并通过__main__
,因为我可以用打印证明,但从不进入子过程的目标函数。
亲自尝试
确保你有使用python 3.4的Ubuntu或类似的Linux。 然后获取所有依赖项:
从git下载omnitool作为zip或克隆: 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进行冻结,但失败的非常相似。但是spec文件不是git跟踪的。
答案 0 :(得分:1)
我在工作中使用了cx_freeze。我不确定这是不是你的问题...但是我使用的是Anaconda发行版,并且cx_freeze没有正确地收集我项目所需的.dll文件。
解决方案是:
奇怪的是,所有的问题都消失了,所有编译的东西也都是这样。
答案 1 :(得分:0)
我知道这可能不是你想听到的,但现实是你永远无法用这种方法取得成功,这就是为什么:
答案 2 :(得分:0)
您遇到的问题可能是由于缺乏依赖性。 cx_Freeze有一些依赖。 为了在python中分发你的工作,许多轻量级包都是可用的。 您可以使用: -
Pyinstaller:可以通过
安装pip install pyinstaller pyinstaller非常适合制作尺寸较小的可执行文件
Py2exe