在另一台计算机上使用包含 pyc 文件的 pyz

Using a pyz containing pyc files on another machine

提问人:LawfulEvil 提问时间:5/17/2016 更新时间:5/17/2016 访问量:1254

问:

在我参与的一个项目中,我们在 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 文件不兼容,但有没有办法使用它?

蟒蛇 python-3.x ubuntu pyc pyz

评论


答:

0赞 farzad 5/17/2016 #1

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

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

更改分发软件的方式

如果您使用 Python wheel 之类的东西来分发软件(那么您的应用程序将作为 Python 包安装在客户端),您可以构建一个独立于版本/平台的通用 wheel。应用程序的起点是分布式模块(分发 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 容器的行可能需要对应用程序/配置进行更多调整,但通常这已经足够了。