【问题标题】:Can a python program be run on a computer without Python? What about C/C++?python程序可以在没有Python的计算机上运行吗?那么 C/C++ 呢?
【发布时间】:2011-06-21 02:40:53
【问题描述】:

我可以创建一个 Python 程序,将其发送到远程计算机,然后在该计算机没有安装 Python 的情况下运行它吗?我听说你不能,因为 Python 需要被解释。如果这是真的,那么这似乎很奇怪,因为除非每个人都决定安装 Python,否则很难分发您的程序。

另外,C 和 C++ 呢?它们可以在没有安装语言的情况下在远程计算机上运行吗? (我认为你可以,因为它是一种编译语言)。

我不太确定,想澄清一下。

编辑:

我在这方面得到了一些不同的答案,不知道该去哪里。我看到我可以在程序中包含 Python 库,并且可以使用 py2exe。

但是,我对 C 和 C++ 感到困惑。我必须在程序中包含他们的库吗?它们只能在某些机器上运行吗?编译器是否允许它在所有机器上运行?

【问题讨论】:

  • 是的,您可以将 python 捆绑为程序的一部分:wiki.python.org/moin/Freeze
  • 在现代平台上,我们有包管理器负责自动安装依赖项(例如 Python 解释器)。
  • 我想看一个关于没有 VM 的 WORA 是多么不可能的简明解释。

标签: c++ python c


【解决方案1】:

查看适用于 Windows 和 Mac 的 py2exe 和 py2app。然而,运行 OSX 和大多数现代 Linuces 的 Mac 都安装了 Python。

C/C++ 应用程序通常编译为可在一种机器/操作系统架构(例如 32 位 Windows 或 64 位 OSX)上运行的可执行文件;这样的可执行文件可以在某些但不是所有机器上运行。例如,64 位 Windows 或 OSX 可以运行为其各自操作系统的 32 位或 64 位风格构建的程序。

【讨论】:

  • 好的,我可以使用py2exe来分发Python了。 C 和 C++ 呢?我得到了不同的答案。我将如何在任何计算机之间分发它?
  • @Justin:“在任何计算机上运行”没有发生。并非所有处理器都使用相同的指令集。最多一个处理器系列将能够运行您的程序,而无需特殊的翻译运行时支持文件,并且为了做很多有用的事情,您还需要特定于操作系统的代码。在多个系统上运行总是需要特定于系统的运行时助手。
【解决方案2】:

python 被解释,所以没有 python 就不会运行。但是,这并不意味着必须安装 python,您可以在程序目录中包含一个副本,甚至可以将您的程序和 python 运行时捆绑到一个文件中。

C 和 C++ compilers 工具链生成机器代码(在大多数情况下,C 解释器确实存在,C 和 C++ -> p-code 和字节码编译器也是如此)。但是大多数 C 和 C++ 程序使用共享库,除非共享库存在,否则不会运行(同样,不必安装,可以放在程序目录中)。通常还有一个构建选项(静态链接)以在主程序文件中包含所有必要的库。

但结果仍然仅限于操作系统和 CPU 架构的特定组合。让程序在多个平台上运行总是需要特定平台的运行时支持。

【讨论】:

    【解决方案3】:

    您可以使用 py2exe 将 Python 程序分发到 Windows。

    http://www.py2exe.org/

    【讨论】:

      【解决方案4】:

      如果您使用任何语言编写了一个程序,并且该程序未编译为机器代码,则某物在用户的计算机上必须 在运行之前将其转换为机器代码。

      对于 JavaScript,“某物” 通常是网络浏览器。在 Python 的情况下,它通常是一个独立的解释器,尽管可以编译它:

      Is it feasible to compile Python to machine code?

      但是,要明确一点:仅仅因为您的程序未编译为 imachine 代码, 意味着它将被解释。用 C# 编写的程序通常编译为MSIL,在程序第一次运行时编译为机器码。 Java 程序在首次运行时也会被编译。

      【讨论】:

        【解决方案5】:

        我将给出一个发送代码到远程机器运行的实际应用。这通常在BOINC 项目中完成,这是一个社区 GRID 计算计划,它产生了诸如 SETI@Home 之类的 gem。这些应用程序通常是经过编译的 C++ 版本,带有 x86-linux、AMD64-linux、win32、win64 和 Mac OS 通用二进制文件(带有 ppc、x86 和 64 位)的多平台二进制文件。分发的种类繁多,但是现代的制作系统可以轻松地自动化所有这些(例如CMake)。

        很多人更喜欢 WORA 方法(编写一次,随处运行)并坚持使用基于 VM 的语言,如 Java 或 Python。在这种情况下,boinc 项目分发 VM 的一个版本以及在其上运行的代码。 Java VM 受到许可问题的困扰,Python VM 要好得多。 Boinc 正在尝试在各种 BOINC 客户端中embed Python VM,以简化基于 Python 的 GRID 应用程序的分发。

        我希望这能让您对应用程序分发有所了解,并帮助您做出明智的决定。

        【讨论】:

          【解决方案6】:

          有一个py2exe 可以生成一个可执行文件,该可执行文件将在另一台计算机上运行,​​而无需该用户安装普通的 Python 包。

          是的,C 和 C++(至少通常)被实现为可以生成独立可执行文件的编译器。

          编辑:在典型情况下,C 或 C++ 实现会将标准库中在程序中使用的函数链接到可执行文件中。这可以(而且通常确实)包含很多不直接使用的内容,但通常仍然不包含(任何接近)整个标准库。

          在大多数情况下,您还可以生成一个可执行文件,该可执行文件依赖于目标机器上已经以共享库、DLL 等形式存在的标准库的实现(不同的操作系统使用不同的名称)。这减小了可执行文件的大小,但增加了分发过程中的麻烦;我将它用于在我自己的机器上编译的代码,但是当/如果我将可执行文件分发给其他任何人时,通常会避免使用它。鉴于目前的硬盘价格,节省磁盘空间很少值得头疼。

          【讨论】:

          • 对于“独立”的弱定义,这意味着“仅依赖于特定操作系统和计算机上已经存在的一组共享库”。是的,这是计算机编程中独立的通常定义,我只是想强调它与字面的英文含义不同。
          • @Ben Voigt:如果您要对此感到迂腐,我仍然不得不不同意(尽管原始陈述也是不正确的)。编译器只生成一个目标文件。由链接器从那里获取东西 - 虽然大多数通常配置为产生依赖于操作系统(等)的输出,但也有可能(至少在某些情况下)产生真正独立的结果(即,将运行作为引导代码)。从他的问题来看,他的目标是 Windows……
          • 也许您会告诉我问题中的 Windows(与 Mac OSX 甚至 iPad 相比)是什么?我同意它不太可能是 linux,用户对操作系统的特定性有更好的概念。是的,您对编译器与工具链有一定的了解。
          • @Ben Voigt:重新阅读它,你是对的。我从昨晚读到的记忆中走出来——我应该知道不要做那样的事情。
          【解决方案7】:

          查看 Pyinstaller 以获取不需要 python 集成的独立可执行文件。好吧,除了关键库之外,它可以运行!

          它最近更新,维护良好,甚至支持 cython 集成,尽管这可能会变得复杂。您可以将文件压缩到更小,或者如果您有多个可执行文件,您可以将它们链接到一个文件以减小大小。

          您当然也可以创建一个安装了 python 的可执行文件。不过不要使用 anaconda(使用默认的 python 3.6)以确保您的程序非常小。

          希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 2017-04-03
            • 2011-06-27
            • 2012-10-21
            • 1970-01-01
            • 2012-07-29
            • 1970-01-01
            • 2019-11-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多