如何使用 py2exe 和 esky 冻结 Celery?

Posted

技术标签:

【中文标题】如何使用 py2exe 和 esky 冻结 Celery?【英文标题】:How do I freeze Celery using py2exe and esky? 【发布时间】:2014-04-08 23:07:29 【问题描述】:

我正在尝试冻结一个 Python 应用程序和 Celery,它与 esky 打包在一起以提供更新功能。我需要将 Celery 冻结,以便它可以看到第一个可执行文件中的模块,该可执行文件也将出现在 py2exe 创建的 library.zip 文件中。

问题是我无法让 Celery 与 esky 一起冷冻。这是我用来尝试找到解决问题的解决方案的最低限度的、精简的 setup.py 文件:

from esky import bdist_esky
from distutils.core import setup

setup(name='ColdCelery',
      scripts=['C:\\Python27\\Lib\\site-packages\\celery\\bin\\celery.py'],
      options = 
          'bdist_esky':
              'freezer_module': 'py2exe',
          
      
)

当我运行以下命令时:

python setup.py bdist_esky

我收到以下错误:

running bdist_esky
running build_scripts
*** searching for required modules *** 
error: c:\temp\tmpz5146o\scripts\celery.py: The process cannot access the file
because it is being used by another process

机器上没有运行可以使用 Celery 的 Python 进程。我认为这是 py2exe 和 esky 之间的冲突,但不知道如何克服它。

我可以使用 py2exe 冻结 Celery 而无需引用 esky 没有问题,但我需要能够在未来更新这个项目,所以 esky 支持是必须的。

【问题讨论】:

【参考方案1】:

我在教程中运行 py2exe 和 esky 时遇到问题

我在我的项目中使用 cx freeze 并没有遇到任何问题。

它还支持python3、linux和mac,所以我建议你试试看。

http://cx-freeze.readthedocs.org/en/latest/

【讨论】:

感谢您的回答。我们最终解决了这个问题,使用了一台只安装了绝对必需品的裸机构建机器。变量越少,事情似乎越稳定。 所以你最终使用了 py2exe 和 esky? 是的,我们两个都在工作,到目前为止我们都很满意。【参考方案2】:

最终,我们没有找到发生故障的原因,但我们确实抓住了一个重要点,我们改变了环境来解决这个问题。

我们的构建机器为开发承担了双重职责。这当然不是最好的主意,它可能是为该开发安装的众多软件包之一,但会引起麻烦。

所以我们从基本的 Windows 安装开始,只安装了实际执行构建所需的最少数量的包。这似乎成功了。

【讨论】:

【参考方案3】:

我重新发现了我们解决此问题的方法。错误信息具有误导性——调试后发现实际错误是esky在打包操作过程中在celery.py顶部添加了一些行引起的。这些行超出了 from __future__ import absolute_import, unicode_literals 导致以下错误:

SyntaxError: from __future__ imports must occur at the beginning of the file

修复:

编辑 C:\Python27\Lib\site-packages\celery\bin\celery.py 并从文件顶部删除所有 cmets 和空行。

【讨论】:

以上是关于如何使用 py2exe 和 esky 冻结 Celery?的主要内容,如果未能解决你的问题,请参考以下文章

Esky 的 Python 项目结构

使用 Esky 冻结/打包 Cocoa PyObjC Python 应用程序

通过 Esky 任务获取进度

将 GitHub 版本与 Esky 一起使用

Python - 代码冻结后控制台关闭

Esky 修补程序