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

3lxsmp7m  于 2022-12-25  发布在  Python
关注(0)|答案(7)|浏览(173)

我想做的是把我的代码发送到一个远程服务器上,这个服务器可能安装了不同的python版本,或者没有我的应用程序需要的软件包。
现在,为了实现这样的可移植性,我不得不用解释器和代码构建可重定位的virtualenv,这种方法有一些问题(例如,由于--always-copy不能像预期的那样工作,你必须手动地将一堆库复制到你的virtualenv中),而且通常很慢。
(理论上)a way可以静态地构建python本身。
我想知道我是否可以把解释器和我的代码打包成一个二进制文件,然后把我的应用程序作为模块运行。./mypython -m myapp run./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application

yyhrrdl8

yyhrrdl81#

有两种方法可以解决你的问题
1.使用静态构建器,如freeze、pyinstallerpy2exe
1.使用cython编译
这个答案解释了如何使用第二种方法,因为第一种方法不是跨平台和跨版本的,在其他答案中已经解释过了。另外,使用pyinstaller这样的程序通常会导致文件很大,而使用cython会导致文件小得多
1.首先,安装cython

sudo -H pip3 install cython

1.然后,您可以使用cython从Python .py文件生成C文件(参考https://stackoverflow.com/a/22040484/5714445

cython example_file.py --embed

1.在获得当前的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更改为您实际尝试编译的任何文件。

  1. Cython用于静态内存分配的C型变量定义,以加速Python程序,但是在本例中,仍然使用传统的Python定义。
    1.如果你正在使用额外的库(例如opencv),你可能需要使用-L提供目录,然后在GCC标志中使用-l指定库的名称。
    1.上面的方法可能不适用于anaconda python,因为你可能需要安装一个与你的conda-python兼容的gcc版本。
brccelvz

brccelvz2#

您可能希望研究一下Nuitka。它获取Python源代码并将其转换为C++ API调用。然后编译为可执行二进制文件(Linux上的ELF)。它已经存在了几年,支持各种Python版本。
如果您使用它,您可能还会获得性能的提高。推荐使用。

9wbgstp7

9wbgstp73#

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

pvabu6sv

pvabu6sv4#

如果你在Mac上,你可以使用py2app创建一个.app包,当你双击Django应用时,它会启动你的Django应用。
我在https://moosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html中描述了如何将Django和CherryPy捆绑成这样一个包
在本文中,我使用pywebview在本地应用程序窗口中显示Django站点。

polhcujo

polhcujo5#

冻结选项:

然而,你的目标服务器应该有你想要的环境-〉你应该能够“创建”它,如果它没有,你应该构建你的软件来匹配环境。
我发现了这个关于如何将自定义版本的python安装到virtualenv的指南,假设你有ssh访问权限:https://stackoverflow.com/a/5507373/5616110
在virtualenv中,你应该可以pip安装任何东西,而且你不需要担心sudo特权,当然,有了这些特权和apt这样的包管理器,一切都变得容易多了。

whhtz7ly

whhtz7ly6#

我创建了一个Docker映像,它依赖于Nuitka和一个定制的静态链接python3.10来创建静态二进制文件。
没有广泛地测试它,如果你有机会请让我知道它是否适合你的用例。
您可以在以下网址查看:https://github.com/joaompinto/docker-build-python-static-bin

vs91vp4v

vs91vp4v7#

你也可以使用pyinstaller包从Python脚本创建一个二进制可执行文件。
下面是一个如何使用pyinstaller创建二进制可执行文件的例子:
首先,使用pip安装pyinstaller包:

pip install pyinstaller

接下来,导航到包含Python脚本的目录。
运行以下命令以创建二进制可执行文件:

pyinstaller -F myscript.py

这将在dist目录中创建一个名为myscript的二进制可执行文件。
您还可以使用--onefile选项创建单个可执行文件,而不是包含多个文件的目录:

pyinstaller --onefile myscript.py

对于更高级的用法,您可以参考pyinstaller文档:https://pyinstaller.readthedocs.io/en/stable/

相关问题