当前位置: 首页 > 面试题库 >

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

贺正祥
2023-03-14
问题内容

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

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

从理论上讲,有一种方法可以静态地自行构建python。

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


问题答案:

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

  1. 使用静态生成器(例如冻结)或pyinstaller,或py2exe
  2. 编译使用 cython

我将解释如何使用第二种方法,因为第一种方法不是跨平台和版本的,并且已在其他答案中进行了解释。此外,使用pyinstaller之类的程序通常会导致文件很大,而使用cython会导致文件大小为KB

首先,安装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”

其他注意事项

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


 类似资料:
  • 问题内容: 有没有办法编译一个node.js应用程序? 问题答案: 我可能已经很晚了,但是您可以使用“ nexe”模块在一个可执行文件中编译nodejs +您的脚本:https : //github.com/crcn/nexe

  • 我正在研究使用协议缓冲区与我们拥有的一些自定义设备进行通信。问题是这些设备运行嵌入式python解释器,我们无法在它们上安装额外的库。有没有办法将. proto文件编译成python而不需要原型库?

  • 问题内容: 是否有一组命令行选项可以说服gcc从自包含的源文件生成平面二进制文件?例如,假设foo.c的内容是 没有外部引用,没有要导出到链接器的内容。我想获得一个仅带此功能机器说明的小文件,而无需任何其他装饰。有点像(DOS).COM文件,但32位保护模式除外。 问题答案: 试试看: 您可以使用来确保它是正确的: 并与二进制文件进行比较:

  • 我构建了一个旧的applet。它自然不会在今天的浏览器中运行。有没有办法找出编译它的Java版本。 另外,我可以使用什么版本的Java,这样我的客户端就不会收到令人讨厌的安全消息,“您确定要运行这个吗?” 第三,带画布的HTML5是否会是小程序的更好选择,因为它实际上只是绘制了一个漂亮的图像网格?

  • 问题内容: 关于如何将像imagemagick这样的第三方预编译二进制文件包含到电子应用程序中,是否有很好的解决方案?有node.js模块,但它们都是包装程序或与系统范围内已安装库的本地绑定。我想知道是否可以在发行版中捆绑预编译的二进制文件。 问题答案: 请参阅 下面的 UPDATE (此方法现在并不理想)。 我确实找到了解决方案,但是我不知道这是否被视为最佳实践。我找不到包含第三方预编译二进制文

  • 问题内容: 如何解析编译静态二进制文件,其中的代码包含函数gethostbyname,并且如果编译时未发出如下警告: 警告:在静态链接的应用程序中使用’gethostbyname’要求在运行时需要glibc版本中用于链接的共享库 我用命令在ubuntu 12.04上编译: 这是lookup.c的代码: 我想检查是否将获得如下输出: 查找:ELF 32位LSB可执行文件,Intel 80386版本1