【问题标题】:cx-freeze, runpy and multiprocessing - multiple paths to failurecx-freeze、runpy 和 multiprocessing - 多条失败路径
【发布时间】:2015-11-03 18:16:35
【问题描述】:

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

基本问题是,在 linux(我的测试用例中是 Ubuntu)上,我的程序(Omnitool)的 cx-freeze 版本无法创建子进程。但是,它适用于 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 表示成功设置,但无论如何都会崩溃。崩溃前不久,pygame UI 出现错误,所以我预计那里有问题。

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

Pastebin Example

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

尝试自己

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

以 zip 格式下载 omnitool 或从 git 克隆: 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

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

我也尝试过使用 pyinstallers python 3 fork 进行冻结,结果非常相似。规范文件没有被 git 跟踪。

【问题讨论】:

  • 为什么要为 Linux 冻结它?
  • 依赖项很难获得,涉及编译,其中许多仅在 pygame 编译期间使用。目前,我的 linux 用户必须在控制台中执行几个步骤才能使我的程序正常工作,而 Windows 用户只需运行设置并单击即可。我想为所有用户提供同样的便利。出于好奇,我个人也想知道为什么会失败以及如何解决。
  • 两个依赖包不在 pip 或 apt-get 上。 Pygame-3 和 pgu。
  • 嗯 - 至少你不是唯一一个看到症状的人 - 请参阅 bugs.launchpad.net/ubuntu/+source/apport/+bug/1024202 和所有重复的错误。当我能拿到一个 Ubuntu 盒子时,我会试着看看它。出于兴趣,您是否在非基于 Debian 的 linux 上尝试过?
  • 没有,目前只有ubuntu和xubuntu

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


【解决方案1】:

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

解决办法是:

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

神奇地,所有的问题都消失了,所有的东西都按预期编译了。

【讨论】:

    【解决方案2】:

    我知道这可能不是您想听到的,但现实情况是您永远无法通过这种方法取得成功,原因如下:

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

    【讨论】:

    • 不涉及 numpy。 PyInstaller 也有同样的问题,还在积极开发中。
    • 请注意,所有操作系统的 32/64 位变体都需要多个包含本机代码的 Python 库构建 - 请参阅 pypi.python.org/pypi/gevent/1.1.2 示例,该示例包含所有受支持的 32 位和 64 位 Python 版本的构建windows,OSX 和 64 位 Linux 也是如此。
    【解决方案3】:

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

    1. Pyinstaller:可以安装

      pip 安装 pyinstaller pyinstaller 非常适合制作更小的可执行文件

    2. Py2exe

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 2015-08-08
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      相关资源
      最近更新 更多