0

在我参与的一个项目中,我们在 Ubuntu 14.04(使用 Python 3.4)上使用 compileall.compile_dir 打包我们的 python 产品。pyc 文件的目录等被捆绑(tar.gz 文件)和分发。更改文件名以删除文件名的 cpython-34 部分。

我们有一个运行 Ubuntu 16.04 的新测试环境,该环境具有 Python 3.5,并希望运行/测试代码。当我们解压并运行它时,我们得到一个错误:

$ ./configure
/usr/bin/python3: can't find '__main__' module in '/home/user/product/configure.pyz'

如果我手动解压缩 pyz 文件并尝试从命令行运行 python,则在导入内容后,我会收到一条消息,说明它是 3.4 二进制文件。相反,如果我在 3.5 机器上构建包,我完全可以在 3.5 机器上运行它,但是当我复制到 3.4 时,我得到了同样的错误。

问题是......我需要做什么来运行/测试它?我的想法...以某种 3.4 兼容模式运行 3.5。安装 3.4(可能来自源代码,因为我找不到 Ubuntu 16.04 的 3.4 包)。也许调整一些 3.5 配置设置?也许在打包时提供一个新设置以允许 3.4 和 3.5 工作?我假设我错过了一些想法,但我不想问我认为解决方案是什么,我想知道解决方案是什么。

谷歌搜索后发现一堆与 pyc 文件有关的 SO 问题,我知道 3.4 文件不兼容,但有没有办法使用它?

4

1 回答 1

0

正如您所提到的,编译的 CPython 文件不一定在不同版本之间兼容,并且取决于平台。

我可以看到 2 种不同的方法,并会为每种方法提出一个解决方案:

改变分发软件的方式

如果您使用Python 轮子之类的东西来分发软件(然后您的应用程序将作为 Python 包安装在客户端),您可以构建一个独立于版本/平台的通用轮子。您的应用程序的起点将是分布式模块安装的脚本(分发 Python 模块的标准方式)。

或者您可能想尝试使用PyInstallercx_Freeze(或类似的东西)将应用程序捆绑为独立的可执行文件。这样,您就不必依赖客户端的 Python 版本,即使它们根本安装了任何版本的 Python。该应用程序是在相应平台/架构上运行的独立可执行文件。

在要运行应用程序的机器上安装相同版本的 Python

如今,在容器(如 docker)的帮助下,这变得容易多了。或者,如果您在使用 docker 时遇到问题,您可能更喜欢从源代码构建它。但是使用docker很简单:

docker pull python:3.4
docker run --rm -it -v $(pwd):/code -w /code python:3.4 python app.pyz 

运行 Python 容器的行可能需要对您的应用程序/配置进行更多调整,但通常这已经足够了。

于 2016-05-17T15:28:20.563 回答