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

时间:2016-10-07 09:24:21

标签: python build

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

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

理论上有a way静态构建python。

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

6 个答案:

答案 0 :(得分:61)

您可以通过两种方式解决问题

  1. 使用静态构建器,如freeze或pyinstaller,或py2exe
  2. 使用cython编译
  3. 我将解释如何使用第二种方法来实现它,因为第一种方法不是跨平台和版本,并且已在其他答案中进行了解释。此外,使用像pyinstaller这样的程序通常会导致文件大小很大,因为使用cython会导致文件的大小为

    首先,安装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-Type Variable定义进行静态内存分配,以加速Python程序。但是,在您的情况下,您仍将使用传统的Python定义。

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

答案 1 :(得分:3)

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

如果您使用它,您可能也会获得性能提升。推荐使用。

答案 2 :(得分:0)

冻结选项:

但是,您的目标服务器应该具有您想要的环境 - >你应该能够“创造”它。如果没有,您应该构建您的软件以匹配环境。

我发现这个方便的指南,介绍如何将自定义版本的python安装到virtualenv,假设你有ssh访问权限:https://stackoverflow.com/a/5507373/5616110

在virtualenv中,你应该能够安装任何东西,你不必担心sudo权限。当然,拥有这些和访问像apt这样的包管理器可以使一切变得更加容易。

答案 3 :(得分:0)

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

PyPi page of Freeze

Python Wiki page of Freeze

Sourceforge page of Freeze

答案 4 :(得分:0)

要冻结python可执行文件并将其发送到您的代码中,请将其嵌入到空shell应用程序中。按照说明如何在official documentation的应用程序中嵌入python。您可以直接从他们在网页上提供的C示例代码开始构建示例应用程序。

让该程序通过嵌入式python执行你的python应用程序。发送程序,你使用的嵌入式python和你的python程序。执行该程序。

答案 5 :(得分:-1)

如果你在Mac上,你可以使用py2app创建一个.app包,当你双击它时启动你的Django应用程序。

我描述了如何将Django和CherryPy捆绑到https://moosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html

这样的包中

在文章中,我使用pywebview在本地应用程序窗口中显示您的Django站点。