在我参与的一个项目中,我们在Ubuntu14.04(使用Python3.4)上使用compileall.compile_dir打包我们的python产品。pyc文件等目录被捆绑(tar.gz文件)并分发。文件名被修改以删除文件名的cpython-34部分。
我们有一个运行Ubuntu16.04的新测试环境,它有Python3.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 (可能来自源代码,因为我找不到Ubuntu16.04的3.4包)。也许可以调整一些3.5配置设置?也许在打包时提供一个新的设置,允许3.4和3.5工作?我想我错过了一些想法,但我不想问我认为解决方案是什么,我想知道解决方案是什么。
在搜索并发现了与pyc文件相关的一系列这样的问题之后,我知道这3.4文件是不兼容的,但是有办法使用它吗?
发布于 2016-05-17 15:28:20
正如您已经提到的,已编写的CPython文件不一定在不同版本之间兼容,并且依赖于平台。
我可以看到两种不同的方法,并对每种方法提出一个解决方案:
改变了发布软件的方式
如果您使用类似于Python轮的东西来分发软件(然后您的应用程序将作为一个package安装在客户端),您可以构建一个与版本/平台无关的通用轮。应用程序的起点是由分布式模块(分发Python模块的标准方式)安装的脚本。
或者,您可能希望尝试使用PyInstaller或冰冻 (或类似的东西)将应用程序捆绑为独立的可执行文件。这样,您就不依赖于客户端的Python版本,即使它们安装了任何版本的Python。应用程序是一个独立的可执行文件,运行在相应的平台/体系结构上。
在要运行应用程序的计算机上安装相同版本的
如今,在集装箱(如码头)的帮助下,这件事变得容易多了。或者,如果您在使用docker方面有问题,您可能更愿意从源代码构建它。但是使用docker很容易:
docker pull python:3.4
docker run --rm -it -v $(pwd):/code -w /code python:3.4 python app.pyz 运行Python容器的行可能需要对您的应用程序/配置进行更多的调整,但一般来说,这已经足够好了。
https://stackoverflow.com/questions/37278968
复制相似问题