cx-freeze,runpy和multiprocessing - 多个失败路径

时间:2015-08-11 13:29:21

标签: python ubuntu multiprocessing python-3.4 cx-freeze

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

基本问题是,在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”给了我这个可爱的追溯,它什么也没告诉我:

Pastebin Example

将其设置为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跟踪的。

3 个答案:

答案 0 :(得分:1)

我在工作中使用了cx_freeze。我不确定这是不是你的问题...但是我使用的是Anaconda发行版,并且cx_freeze没有正确地收集我项目所需的.dll文件。

解决方案是:

  1. 安装Python的平面版本
  2. 使用我为该项目所需的包创建一个环境
  3. 运行cx_freeze。
  4. 奇怪的是,所有的问题都消失了,所有编译的东西也都是这样。

答案 1 :(得分:0)

我知道这可能不是你想听到的,但现实是你永远无法用这种方法取得成功,这就是为什么:

  • Linux没有可移植的Python包二进制文件,这意味着一个发行版上的编译numpy可能不适用于另一个发行版。它甚至可以在相同的发行版和版本中发生,只是因为一个系统库收到了更新。
  • manylinux1应该解决这个问题但很难为它构建软件包,只有少数人开始使用它。
  • cx-freeze项目于2014年12月发布最新版本,在Python时间表上将其作为一个废弃项目。

答案 2 :(得分:0)

您遇到的问题可能是由于缺乏依赖性。 cx_Freeze有一些依赖。 为了在python中分发你的工作,许多轻量级包都是可用的。 您可以使用: -

  1. Pyinstaller:可以通过

    安装

    pip install pyinstaller pyinstaller非常适合制作尺寸较小的可执行文件

  2. Py2exe