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

有没有办法将python应用程序编译成静态二进制文件?,python,build,Python,Build,我试图做的是将代码发送到远程服务器,该服务器可能安装了不同的python版本和/或可能没有我的应用程序所需的软件包 现在要实现这种可移植性,我必须用解释器和代码构建可重定位的virtualenv。这种方法存在一些问题(例如,您必须手动将一组库复制到virtualenv中,因为--总是复制无法按预期工作),而且通常速度较慢 (理论上)静态地构建python本身是不可能的 我想知道我是否可以将带代码的解释器打包成一个二进制文件,并作为模块运行我的应用程序。类似于:/mypython-m myapp

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

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

(理论上)静态地构建python本身是不可能的

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

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

我找到了这本关于如何将自定义版本的python安装到virtualenv(假设您具有ssh访问权限)的便捷指南:


在virtualenv中,您应该能够pip安装任何东西,并且不需要担心sudo权限。当然,拥有这些功能并访问像apt这样的软件包管理器会使一切变得更加容易。

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


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

  • 使用静态构建器,如freeze,或
    pyinstaller
    ,或
    py2exe
  • 使用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文件)

    (参考)

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

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

    其他需要注意的事项

  • Cython用于使用C类型变量定义进行静态内存分配,以加快Python程序的速度。然而,在您的例子中,您仍然将使用传统的Python定义
  • 如果您正在使用其他库(例如
    opencv
    ),则可能必须使用
    -L
    向它们提供目录,然后在GCC标志中使用
    -L
    指定库的名称。有关这方面的更多信息,请参阅GCC标志

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


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

    如果您在Mac上,您可以使用py2app创建.app捆绑包,当您双击Django应用程序时,该捆绑包将启动该应用程序

    我描述了如何将Django和CherryPy打包成这样一个包


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

    您的意思是像cx_freeze这样的东西吗?@TigerhawkT3,直到今天我才听说cx_freeze。通过文档查看,似乎这正是我想要的,但它无法使用python3.5.1在Ubuntu12.04.5上构建。我正在寻找替代方案,感谢您朝着正确的方向努力。遗憾的是,pyinstaller不适用于Django 1.9,py2app/py2exe不支持linux:(如果cx_Freeze和pyinstaller不起作用,仍然有希望。您可以为您的目标发行版创建包)这将解决所有与安装相关的问题。或者,可能使用docker之类的工具来运行你的应用程序。其他选项是nuitka和cythonI。我已经在使用virtualenv,但事实并非如此。我的问题是关于静态编译的python,其中包含所需的模块和应用程序。然后你必须将其冻结,没有其他方法。我找不到关于在Django中使用Nuitka的任何信息。你是否有这样的经验?@roboslone,Prakar Agarwal Cython与Nuitka PyPy的静态生成器相比,对外部库的支持非常好。例如,从本文末尾的链接中,“人们使用Cython是因为它帮助他们解决了一个问题。要么他们想从Python代码连接到外部非Python库,要么他们想能够手动优化他们的代码,要么两者兼而有之。",链接是R.S.Nikhil Krishna,我不是想让我的代码更快,我只是想用一个二进制文件,里面有python解释器。啊,好吧。我以为你想把它与一些外部库绑定。我的不好。我的应用程序主要在Linux上运行,所以py2app不适用。虽然本文使用py2app,但可以使用pyinstaller完成,不是吗oo.Hi,如果我的应用程序跨越多个文件该怎么办?这种方法似乎只编译当前脚本,而不是所有Python依赖项。现在不需要将Python文件(比如test.py)重命名为pyx,这对我帮助很大。要回答有关多个文件的问题,可以使用cythonize:
    cythonize-i file\u 0.py[…]file_n.py
    用于所有python模块,然后
    cython main_file.py——嵌入
    用于主模块
    $ python -V