【问题标题】:C++ "Hello World" program that calls hello.py to output the string?调用 hello.py 输出字符串的 C++“Hello World”程序?
【发布时间】:2022-01-10 01:12:21
【问题描述】:

我想学习如何在 C++ 代码中执行 Python 程序。这是如何完成的,例如使用最简单的 C++ 和 Python 程序,如下所示(经典的“Hello World”程序)?现在我想学习如何在我的 Windows 10 桌面上执行此操作,我有 Visual Studio 并且可以编码和执行 C/C++/Python;一个长期的目标是在 Raspberry Pi 上做这种事情。非常感谢任何帮助。我的 Windows 10 PC 上安装了 Python 3。

// C++ Program
#include <iostream>
int main() {
    std::cout << "Hello World!";
    // How can the above line of code be changed so that 
    // 'Hello World!' is output using a call to a simple
    // hello.py program ?
    return 0;
}

【问题讨论】:

  • 您愿意使用 CPython API,还是愿意使用 pybind11 等 C++ 库?
  • 我假设你想启动 python 解释器并让它执行脚本?最简单的方法是使用system 函数,为其提供整个命令行。如果您想与命令解释器popen 进行通信,可能会感兴趣,或者您直接下到 windows API(不太方便):CreateProcess
  • 为了得到更有针对性的答案,您能否不再强调问题的 Raspberry Pi 部分,或许稍后将其作为新问题的焦点?
  • @Aconcagua:是的,启动 python 解释器并让它打印出“Hello World”。但是....虽然我从未这样做过,但我认为 python 程序可以转换为可执行文件,并且尝试一下也很有趣,那就是让 C++ 程序运行一个可执行文件。

标签: python c++ visual-studio


【解决方案1】:

在 C/C++ 上,您可以使用系统命令来执行任何 shell 命令。这将允许您使用几乎任何其他语言,包括 Python、Node.js、C#... docs

#include <cstdlib>
int main(){
    system("echo hello world");
}

【讨论】:

  • 这看起来太简单了,哈哈,但如果它有效,作为一个简单的解决方案将是惊人的。我将使用该代码,谢谢!
【解决方案2】:

在 Visual Studio 中,您需要确保相关的 Python 包含目录和库已链接到您的 C++ 项目。首先,找到你系统上安装 Python 的位置;对我来说,它位于C:\Python39,但如果 Windows 决定将其埋在其他地方,您可能不得不进行一些疯狂的追逐。

确保您的目标架构与 Python 架构相匹配;这几乎可以肯定意味着确保将大友好Local Windows Debugger 按钮旁边的下拉菜单设置为x64

接下来,在您的 Visual Studio 项目中,假设它的名称为 PythonTestProject,您需要在解决方案资源管理器窗口中右键单击项目名称并单击属性。然后导航到Configuration Properties -&gt; C/C++ -&gt; General 并将目录C:\Python39\include 添加到Addition include directories 字段,当然将路径前缀更改为您安装的位置。然后导航到Configuration Properties -&gt; Linker -&gt; Input 并将C:\Python39\libs\python3.lib;(注意分号)添加到Additional dependencies 字段。您的项目现在可以在 Python 上运行了。

要运行一个简单的文件,你需要Python.h中提供的PyRun_SimpleFile(这里的简单实际上并不是指文件中的代码有多复杂,就像简单的调用约定一样)。您还需要在调用此函数之前初始化解释器,并且可以选择在之后清理它,尽管这将在您的程序结束时自动完成。所以是这样的:

#include <Python.h>
#include <stdio.h>

int main()
{
    // Initialize the Python interpreter
    Py_Initialize();

    // Open a script and run it
    const char* filename = "hello.py";
    FILE* f = fopen(filename, "rb");
    PyRun_SimpleFile(f, filename);

    // Clean up any memory and state allocated by the Python interpreter
    fclose(f);
    Py_Finalize();
}

应该可以解决问题。确保hello.py 与您项目中的其他源文件位于同一目录中,点击那个友好的调试按钮,它应该会运行您的文件。

希望这能让你走上正轨:)。我强烈建议您研究诸如pybind11 之类的 C++ 库,这将使您的生活比直接处理 C API 更容易(很多)。但是,如果您只想做这样简单的事情,那就不值得了; C API documentation 中描述的功能可以非常轻松地完成很多简单的任务。

【讨论】:

  • 多米尼克,谢谢!我会尝试一下,看看我能不能做到这一点。暴风雪明天晚些时候来,所以我将有一些室内雪地时间来消磨这个项目!
  • 使用python3.lib时,尽量使用release模式。
猜你喜欢
  • 2020-05-02
  • 2011-12-14
  • 2018-10-30
  • 2016-04-05
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
相关资源
最近更新 更多