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

rob*_*one 58 python build

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

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

(理论上)有一种静态构建python 的方法.

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

R. *_*hna 74

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

  1. 使用静态构建器,如freeze,pyinstaller或py2exe
  2. 使用cython编译

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

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

$ sudo pip install cython
$ mv test.py test.pyx
Run Code Online (Sandbox Code Playgroud)

然后,你可以使用cython和GCC来编译它(Cython从Python .pyx文件生成一个C文件,然后GCC编译C文件)(参考/sf/answers/1542833911/ 5714445)

$ cython test.pyx --embed
$ gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl
Run Code Online (Sandbox Code Playgroud)

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

$ python -V
Run Code Online (Sandbox Code Playgroud)

您现在将拥有一个二进制文件'test',这正是您要寻找的

注意:Cython用于使用C-Type Variable定义进行静态内存分配,以加速Python程序.但是,在您的情况下,您仍将使用传统的Python定义.

注意2:如果您正在使用其他库(例如opencv),则可能必须使用-L为它们提供目录,然后在GCC Flags中使用-l指定库的名称.有关这方面的更多信息,请参阅GCC标志

  • 嗨,如果我的应用程序跨越多个文件怎么办?这种方法似乎只编译当前脚本而不是所有Python依赖项. (14认同)
  • 警告:Cython 需要动态加载内容,并且它不会生成独立的二进制文件。不要浪费你的时间! (4认同)
  • 这对我帮助很大。要回答有关多个文件的问题,您可以对所有 python 模块使用 cythonize: `cythonize -i file_0.py [...] file_n.py`,然后对主脚本使用 `cython main_file.py --embed`。您最终会得到一个可执行文件和 .so 文件(.dll、.dylib,具体取决于您的操作系统),您可以将它们一起用作独立的解决方案。 (3认同)
  • 无需立即将python文件(例如test.py)重命名为pyx (2认同)

小智 5

您可能正在寻找像 Freeze 这样的东西,它能够将您的 Python 应用程序及其所有库编译成静态二进制文件:

Freeze 的 PyPi 页面

Freeze 的 Python Wiki 页面

Freeze 的 Sourceforge 页面


Pra*_*wal 5

您可能希望调查Nuitka。它需要python源代码并将其转换为C ++ API调用。然后将其编译为可执行二进制文件(在Linux上为ELF)。它已经存在了几年,并且支持多种Python版本。

如果使用它,您可能还会获得性能上的改进。推荐的。

  • RS Nikhil Krishna,我不是要让我的代码更快,我是想将它以一个带有 python 解释器的二进制文件的形式发布。 (3认同)