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

2024-03-22

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

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

有(理论上)a way https://wiki.python.org/moin/BuildStatically静态构建 python 本身。

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


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

  1. 使用静态构建器,例如冻结,或者pyinstaller, or py2exe
  2. 编译使用cython

这个答案解释了如何使用第二种方法来执行此操作,因为第一种方法不是跨平台和版本的,并且已在其他答案中进行了解释。此外,使用 pyinstaller 等程序通常会产生巨大的文件大小,而使用 cython 会产生小得多的文件

  1. 首先,安装cython.

    sudo -H pip3 install cython
    
  2. 然后,您可以使用cython从 Python 生成 C 文件.py文件 (在参照https://stackoverflow.com/a/22040484/5714445 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. Change example_file.py到您实际尝试编译的任何文件。
  2. Cython 用于使用 C 类型变量定义进行静态内存分配,以加速 Python 程序。然而,就您的情况而言,您仍将使用传统的 Python 定义。
  3. 如果您正在使用其他库(例如opencv,例如),您可能必须使用以下方式向他们提供目录-L然后使用指定库的名称-l在海湾合作委员会旗帜中。有关这方面的更多信息,请参阅 GCC 标志
  4. 上述方法可能不适用于 anaconda python,因为您可能必须安装与您的 conda-python 兼容的 gcc 版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 按组选择第一行

    从这样的数据框 test lt data frame id rep 1 5 2 string LETTERS 1 10 test lt test order test id rownames test lt 1 10 gt test id
  • 使用 PHP 和 PHPWord 将 HTML 代码转换为文档

    我正在使用 PHPWord 加载 docx 模板并替换标签 例如 test 这工作得很好 但我想用 html 代码替换一个值 直接将其替换到模板中是不可能的 据我所知 现在有办法使用 PHPWord 来做到这一点 我查看了 htmltodo
  • 如何从 PowerShell 1.0 调用 DLL 方法 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我使用 PowerShell 1 0 版脚本从 DLL 文件调用方法 并使用以下代码将 DLL 文件加载到 PowerShell 中 Sys
  • 这是真实的约会吗

    PHP 是否有一个函数可以帮助确定日期是否是真实日期 例如February 29 2011不是真实的 因为今年2月只有28天 这就是我要问的那种 真实约会 PHP 有什么可以帮助的吗 您想使用检查日期 http php net manual
  • Codebhind javascript 警报“是”和“否”无法正常工作

    我已经写了 是 和 否 的确认消息 这是代码 function myTestFunction if confirm Are you sure you want to override the file return true else re
  • 透明 jQuery UI 对话框

    有人知道如何使 ui 对话框透明吗 创建一个类 transparent class filter alpha opacity 50 for IE4 IE7 ms filter progid DXImageTransform Microsof
  • 如何在 HTML 中制作选项卡式视图?

    单击选项卡 A 时 显示选项卡 A 的内容 单击选项卡 B 时 显示选项卡 B 的内容 依此类推 构建 HTML 片段最简单且兼容的方法是什么 我不想在这里使用任何库 所以没有jQuery http en wikipedia org wik
  • 使用 glTexImage2D 的奇怪结果

    我一直在试图弄清楚如何glTexImage2D有效 并且从一些非常清晰的代码中看到一些奇怪的结果 我的代码只是将一个粗略的圆绘制到一个 256 256 长度的无符号数组中 然后将该数据发送出去以成为纹理 然而 无论我在图像创建循环中选择什么
  • 根据时间在 perl 脚本中运行子程序?

    我有一个 perl 脚本 它作为守护进程一直循环运行 我想在基于时间 或计时器 的 perl 脚本中运行一个子函数 因此每 2 小时它将运行该子函数并继续其循环 我正在考虑获取纪元时间 然后通过循环检查几次 一旦它大于 2 小时 它就会运行
  • 仅当 EntityCollection 或 EntityReference 不包含对象时才能调用 Load

    正如标题所示 当我使用实体框架 4 1 的延迟加载来关闭跟踪时 我收到了错误 完整的异常消息 当使用 NoTracking 合并选项返回对象时 仅当 EntityCollection 或 EntityReference 不包含对象时才能调用
  • Joda 时间 两个日期之间的时间间隔(包括时区)

    我使用 JodaTime 库进行时间操作 我有两个日期 日期一 DateTime time server new DateTime server time milisecs withZone DateTimeZone forID Europ
  • Devise 令牌身份验证错误:未设置 Devise.secret_key

    我目前正在使用 Devise 令牌身份验证 https github com lynndylanhurley devise token auth https github com lynndylanhurley devise token a
  • 如何隐藏“网络”选项卡中的请求

    如何在浏览器开发者工具的网络选项卡中隐藏 api 服务请求 任何建议 尽管我强烈建议不要这样做 因为它不会阻止任何认真的用户 但是可以通过 flash 或任何其他具有此类功能的插件来发送它 实现这一目标的最简单方法是使用启用 Flash 的
  • Paramiko - 在“后台”运行命令

    我已经使用 exec command 成功实现了 Paramiko 但是 我在远程计算机上运行的命令有时可能需要几分钟才能完成 在此期间 我的 Python 脚本必须等待远程命令完成并接收标准输出 我的目标是让远程机器 在后台运行 并允许本
  • Angular 下载大 blob

    我有一个类似的问题this one https stackoverflow com questions 46932213 how to download large file with javascript我成功下载了通过 HTTP GET
  • Objective-C:Unicode 日期格式

    我正在尝试找出如何使用 UNICODE 表示 Sun 03 May 2009 19 58 58 0700 as eee dd MMM yyyy HH mm s ZZZZ 或其他 我似乎无法让它精确地工作 Use an NSDateForma
  • 字符编码问题?

    在我的 mysql 数据库中 页面名称字段中有以下信息 如果我执行 phpmyadmin 转储 则会导出以上内容 我正在使用不同的 php 脚本 而不是上面的脚本 我得到的是这个 这是生成输出的片段 data sql SELECT FROM
  • SQL 存储过程 - 从多个数据库执行

    我的公司使用来自许多客户的数据 并且忽略了记录我们数据库的表和字段所代表的内容 为了帮助解决这个问题 我编写了一些存储过程 这些过程似乎只适用于它们所在的数据库 我希望服务器上有一个存储过程实例 可以在其所有数据库上使用 但不知道如何实现这
  • 在 Idea 中查找对某个对象的所有引用

    Intellij IDEA IDE 是否有快捷键或选项来查找对某个文件的所有引用Class在一个特定的项目中 例如 我创建了自己的Class持有一个String and an int我已经通过该项目进行了参考 该项目相当大 我不想手动搜索每
  • 有没有办法将 python 应用程序编译成静态二进制文件?

    我想做的是将我的代码发送到远程服务器 该服务器可能安装了不同的 python 版本和 或可能没有我的应用程序所需的包 现在为了实现这种可移植性 我必须使用解释器和代码构建可重定位的 virtualenv 这种方法有一些问题 例如 您必须手动