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

我试图做的是将我的代码发送到一个远程服务器,这个服务器可能安装了不同的 python 版本,并且/或者没有我的应用程序需要的软件包。

现在,为了实现这种可移植性,我必须用解释器和代码构建可重定位的 Virtual alenv。这种方法存在一些问题(例如,由于 --always-copy不能像预期的那样工作,因此必须手动将大量库复制到 Virtual alenv 中) ,而且通常速度很慢。

(理论上) 一条路可以静态地构建 python 本身。

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

115576 次浏览

冻结选项:

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

我找到了如何将自定义版本的 python 安装到 viralenv 的方便指南,假设您具有 ssh 访问权限: https://stackoverflow.com/a/5507373/5616110

在 viralenv 中,您应该能够 pip 安装任何东西,并且不需要担心 sudo 特权。当然,拥有这些以及对 apt 这样的包管理器的访问会使所有事情变得容易得多。

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

PyPi 的冻结页面

PythonWiki 冻结页面

冰冻源锻造页面

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

  1. 使用静态构建器,如冻结、 pyinstallerpy2exe
  2. Compile using cython

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

  1. 首先,安装 cython

    sudo -H pip3 install cython
    
  2. 然后,您可以使用 cython从 Python.py文件中生成一个 C 文件 (关于 https://stackoverflow.com/a/22040484/5714445)

    cython example_file.py --embed
    
  3. 在得到当前的 Python 版本之后,使用 GCC 来编译它(注意: 下面假设您正在尝试将它编译成 Python 3)

    PYTHONLIBVER=python$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))')$(python3-config --abiflags)
    gcc -Os $(python3-config --includes) example_file.c -o output_bin_file $(python3-config --ldflags) -l$PYTHONLIBVER
    

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

其他需要注意的事项 :

  1. example_file.py更改为您实际尝试编译的任何文件。
  2. Cython 用于使用 C-Type 变量定义静态分配来加快 Python 程序的运行速度。但是,在您的情况下,您仍将使用传统的 Python 定义。
  3. 如果使用其他库(例如 opencv) ,则可能必须使用 -L向它们提供目录,然后在 GCC 标志中使用 -l指定库的名称。有关这方面的更多信息,请参考海湾合作委员会的标志
  4. 上述方法可能不适用于 anaconda python,因为您可能必须安装与 conda-python 兼容的 gcc 版本。

您可能希望调查 努伊特卡。它接受 python 源代码并将其转换为 C + + API 调用。然后它编译成一个可执行的二进制文件(Linux 上的 ELF)。它已经出现几年了,并且支持各种各样的 Python 版本。

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

如果你在 Mac 上,你可以使用 py2app 来创建一个。App bundle,当你双击它时,它会启动你的 Django 应用。

我在 https://moosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html中描述了如何将 Django 和 CherryPy 绑定到这样一个包中

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

我已经创建了一个依赖于 Nuitka 和自定义静态链接 python3.10来创建静态二进制文件的 docker 映像。

没有广泛地测试它,如果你有机会请让我知道它是否适合你的用例。

你可以在以下网址查阅: Https://github.com/joaompinto/docker-build-python-static-bin