【问题标题】:Embedding Python in C++ Script, PyRun_SimpleFile not working as expected在 C++ 脚本中嵌入 Python,PyRun_SimpleFile 无法按预期工作
【发布时间】:2021-07-09 00:08:07
【问题描述】:

我正在尝试在我的 c++ 程序中嵌入一个 python 脚本文件。我已经包含了Python.h,它按预期工作。

#include "MathFunction.h"
#include <Python.h>

int main() {
    char filename[] = "TestPy.py";
    Py_Initialize();

    FILE *fp;
    fp = _Py_fopen(filename, "r");
    PyRun_SimpleFile(fp, filename);
    
    Py_Finalize();

    return 0;
}

注意:我尝试使用fopen,而不是_Py_fopen,但结果相同。

但是,当我运行此代码时,我得到一个退出代码 0(好),但我的 TestPy.py 没有输出,它有:

import matplotlib.pyplot as plt

l1 = [1, 2, 3, 4]
l2 = [3, 6, 4, 5]
plt.plot(l1)
plt.show()

我期待一个绘图打开,就像在 Python 中本地运行它时一样。 即使python 文件很简单

Print("Hello!"), I don't see the print statement in the console.

我没有得到任何控制台输出。 虽然,当我使用

PyRun_SimpleString("print('Hello!')");

正如预期的那样,我得到的不是PyRun_SimpleFile,而是控制台输出“Hello!”。这可能是什么原因?

TestPy.py 与 c++ 文件在同一目录中。

【问题讨论】:

  • 使用matplotlib 的第二个脚本确实会产生任何控制台输出——你期待什么?
  • @martineau 我稍微编辑了我的帖子以反映我的期望,谢谢。我希望绘图能够像在 Python 中一样打开,但我也很困惑为什么执行简单的 Print() 不会输出到控制台。
  • 非常适合我,程序会打开一个带有绘图的窗口。
  • @n.'pronouns'm。我正在 Windows 上使用 CLion 构建/运行...这与它有什么关系吗?你在 Linux 上吗?
  • "TestPy.py 与 c++ 文件在同一目录中。" C++ 文件的位置无关紧要。确实,大多数项目在许多不同的目录中都有许多 C++ 文件,它们怎么可能都相关?您需要熟悉当前工作目录的概念。 TestPy.py 是一个相对路径。相对于什么?到当前工作目录。因此,您需要查看您的项目设置并确定运行程序时当前的工作目录是什么。

标签: python c++


【解决方案1】:

我们在 Windows 上遇到了同样的问题(在 linux 上,您输入的代码应该可以工作)。

按照这个答案是好的:Why does the Python/C API crash on PyRun_SimpleFile?

PyObject *obj = Py_BuildValue("s", "test.py");
FILE *file = _Py_fopen_obj(obj, "r+");
if(file != NULL) {
    PyRun_SimpleFile(file, "test.py");
}

TLDR : onwindows fopen 不起作用,_Py_fopen_obj 起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-02
    • 2015-06-26
    • 2021-12-20
    • 1970-01-01
    • 2013-09-30
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多