繁体   English   中英

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

[英]cx-freeze, runpy and multiprocessing - multiple paths to failure

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

基本的问题是,在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例子

相反,将它设置为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参数运行omnisetup.py

我也试过用pyinstallers python 3 fork冻结,它失败的非常相似。 但是spec文件不是git跟踪的。

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

解决方案是:

  1. 安装Python的平面版本
  2. 使用我为该项目所需的包创建一个环境
  3. 运行cx_freeze。

奇迹般地,所有的问题都消失了,所有编译的东西也都是如此。

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

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

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

  1. Pyinstaller:它可以安装

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

  2. Py2exe

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM