在我参与的项目中,我们使用compileall.compile_dir在Ubuntu 14.04(使用Python 3.4)上打包我们的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工作?我认为我错过了一些想法,但我不想问我认为解决方案是什么,我想知道解决方案是什么。
用google搜索并发现了一些与pyc文件有关的SO问题,我知道3.4文件不兼容,但有没有办法使用它?答案 0 :(得分:0)
正如您所提到的,已编译的CPython文件不一定在不同版本之间兼容,并且与平台有关。
我可以看到两种不同的方法,并为每种方法提出解决方案:
更改分发软件的方式
如果您使用Python wheel之类的东西来分发软件(那么您的应用程序将作为Python包安装在客户端),您可以构建一个通用轮,即版本/平台独立。应用程序的起点是分布式模块安装的脚本(分发Python模块的标准方法)。
或者您可能希望尝试使用PyInstaller或cx_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容器的行可能需要对您的应用程序/配置进行更多调整,但通常情况下还不错。