gpt4 book ai didi

python - 在 C/C++ 中嵌入 Python

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:19 26 4
gpt4 key购买 nike

在我的计算机科学高级项目中,我正在制作一款益智视频游戏,教人们如何使用 Python 编写代码。设计的最大部分涉及创建用户可以分类的引人入胜的谜题。然而,拼图设计不是我目前遇到的问题。

虽然我最初的想法是让每个“问题”都有一系列预期答案来检查用户的答案,但我学校的 CS 系主任(负责高级研讨会)建议我改用嵌入式 Python,他推荐既是为了挑战我,也是为了让数据更容易嵌入一个简单的解释器,该解释器将根据预期输出检查用户代码输出。

快进四个星期,我学到了很多关于 Python 实际工作原理的知识。我什至让解释器将 简单的 C 字符串 作为 python 代码,比如 print("hello") 或 print("hello/tworld"),只要 C 字符串中没有空格.

这段代码看起来像

#include "pch.h"
#include <iostream>
#include <string>
#include <fstream>
#include <Python.h>

void exec_pycode(const char* code);

int main()
{
using namespace std;
Py_Initialize();

string input;

cin >> input;
/*Though the variable gets passed to a const char* definition,
the pointer is constant over the character, because the pointer ALWAYS points
to the same function*/
char const *PyCode = input.data();

exec_pycode(PyCode);

Py_Finalize();
return EXIT_SUCCESS;
}

//The execution of python code as a simple string in C and interpreting in python
void exec_pycode(const char* code)
{
Py_Initialize();
PyRun_SimpleString(code);
Py_Finalize();
}

我决定的下一步是让像 print("hello world") 这样的字符串包含空格,像 Python 代码一样可读。

我已经尝试将执行代码函数更改为看起来像

void exec_pycode(const char* code)
{
Py_Initialize();
const char *inFile = "FileName";
PyObject *dict = PyDict_New();
Py_CompileString(code, inFile, Py_file_input);
PyRun_String(code, Py_file_input, dict, dict);

Py_Finalize();
}

当函数像这样更改时编译正常,但是当我输入任何字符串时,简单的或带有空格的字符串,程序退出并返回 0 值而不打印任何 python 代码。

我很好奇为什么会发生这种情况,我是否在将用户输入转换为足够的 C 字符串以作为 Python 代码读取时遇到问题,或者它不理解 Py_CompileString(const char *str , const char *filename, int start)PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals), I have stared at this documentation, taken notes, diagrammed, and I still get the same exit condition .

我也想知道:

  1. 如果我为 Python 字符串命令声明字典以正确读取代码,或者如果它是
  2. 如果在简化版本中将我的 Python 文件标志设置为 NULL 而不是 Py_CompileStrngFlags(...)Py_RunStringFlags(...) 这就是导致我遇到的 NULL 问题返回值的原因。
  3. 如果我什至使用正确的函数来运行带有用户输入的嵌入式 Python。

最佳答案

您的程序中不需要 C 标记。您的问题仅与 C++ 代码有关。首先,

string input;

cin >> input;

读取 一个空格分隔的单词,与 C 中的 scanf("%s", input); 不同。您需要使用

getline(cin, input);

下一个问题是 input.data() need not be zero-terminated .您必须使用 input.c_str() 代替。

最后:您必须始终检查您调用的每个 Python API 函数的返回值。没有允许的快捷方式。

关于python - 在 C/C++ 中嵌入 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57937907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com