有没有办法将python应用程序编译成静态二进制文件?

2024-05-20 11:00:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我要做的是将代码发送到一个远程服务器,该服务器可能安装了不同的python版本和/或可能没有我的应用所需的包。

现在要实现这种可移植性,我必须用解释器和代码构建可重定位的virtualenv。这种方法有一些问题(例如,您必须手动将一堆库复制到virtualenv中,因为--always-copy无法按预期工作),而且通常速度很慢。

(理论上)可以a way静态地构建python本身。

我想知道我是否可以将解释器和我的代码打包成一个二进制文件,并作为模块运行我的应用程序。像这样的:./mypython -m myapp run./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application


Tags: 方法代码定位版本服务器远程virtualenv手动
3条回答

冻结选项:

但是,目标服务器应该具有所需的环境->;您应该能够“创建”它。如果没有,您应该构建与环境匹配的软件。

我找到了这个关于如何将定制版本的python安装到virtualenv的指南,假设您有ssh访问权:https://stackoverflow.com/a/5507373/5616110

在virtualenv中,您应该能够pip安装任何东西,并且不必担心sudo特权。当然,拥有这些并访问apt这样的包管理器会让一切变得更容易。

有两种方法可以解决你的问题

  1. 使用静态生成器,如freeze、pyinstaller或py2exe
  2. 使用cython编译

我将解释如何使用第二种方法来完成它,因为第一种方法不是跨平台和版本的,并且已经在其他答案中解释过了。另外,使用像pyinstaller这样的程序通常会导致巨大的文件大小,其中使用cython会导致大小为KBs的文件

首先,安装cython。然后,将python文件(比如test.py)重命名为pyx文件

$ sudo pip install cython
$ mv test.py test.pyx

然后,可以使用cython和GCC一起编译它(cython从Python.pyx文件生成一个C文件,然后GCC编译C文件) (参考https://stackoverflow.com/a/22040484/5714445

$ cython test.pyx --embed
$ gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl

注意:根据python的版本,可能需要更改最后一个命令。要知道您使用的是哪个版本的python,只需使用

$ python -V

现在您将拥有一个二进制文件“test”,这就是您要查找的

注意:Cython用于使用C类型变量定义进行静态内存分配,以加快Python程序的速度。但是,在您的情况下,您仍然将使用传统的Python定义。

注意2:如果使用其他库(例如opencv),则可能需要使用-L向它们提供目录,然后在GCC标志中使用-L指定库的名称。有关更多信息,请参阅GCC标志

你可能想调查一下Nuitka。它使用Python源代码并将其转换为C++ API调用。然后它编译成一个可执行的二进制文件(Linux上的ELF)。它已经存在了几年,并且支持各种各样的Python版本。

如果你使用它,你可能也会得到性能的提高。推荐。

相关问题 更多 >