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

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

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

有(理论上)a way静态构建python本身。

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

最佳答案

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

  1. 使用静态构建器,例如 freeze、pyinstallerpy2exe
  2. 使用 cython
  3. 编译

此答案解释了如何使用第二种方法进行操作,因为第一种方法不是跨平台和版本的,并且已在其他答案中进行了解释。此外,使用 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编译(注意:以下假设您正在尝试将其编译为Python3)

    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 类型变量定义进行静态内存分配,以加速 Python 程序。但是,在您的情况下,您仍将使用传统的 Python 定义。
  3. 如果您使用其他库(例如 opencv),您可能必须使用 -L 向它们提供目录,然后指定在 GCcflags中使用 -l 的库。有关这方面的更多信息,请参阅 GCcflags
  4. 上述方法可能不适用于 anaconda python,因为您可能必须安装与您的 conda-python 兼容的 gcc 版本。

https://stackoverflow.com/questions/39913847/

相关文章:

android - 如何将构建时间戳写入apk

android - 使用 gradle 签署产品 flavor

build - CMakeLists.txt 中未使用 CMAKE_BUILD_TYPE

Ant 到 Maven - 多个构建目标

javascript - 我可以使用 webpack 分别生成 CSS 和 JS 吗?

visual-studio - VS2005 : Assembly '' is

visual-studio - Visual Studio 在构建期间不断挂起

ios - Swift 框架不适用于命名为 'Debug' 或 'Release' : No suc

c++ - 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值

c# - 自动在 Visual Studio c# 项目中嵌入 mercurial 修订信息