如何通过PyRun运行读取到std::string中的python文件

0 投票
1 回答
2531 浏览
提问于 2025-04-16 06:08

我正在把Python嵌入到我的C++程序中,之前用PyRun_SimpleString这个方法效果很好,但现在遇到了一些问题。

我做的是把一个python.py文件加载到一个std::string中,但现在在运行这个文件时遇到了麻烦。PyRun_SimpleFileEx这个方法似乎也不管用,所以希望能得到一些帮助!

    std::string content;
    if(!ail::read_file(python_script, content))
    {
        error("Failed to load Python script \"" + python_script + "\"");
        return false;
    }

    if(prompt_mode)
        initialise_console();

    content = ail::replace_string(content, "\r", "");

    Py_Initialize();
    initialise_module();

    std::string script_directory;
    if(get_base_name(python_script, script_directory))
        PyRun_SimpleString(("import sys\nsys.path.append('" + script_directory + "')\n").c_str());

        write_line("Script dir: " + script_directory);
        ////-python_script H:\\CRAW\\craw\\script\\craw.py
        //content.c_str()

    //FILE *fp;
    //fp = fopen("H:\\CRAW\\craw\\script\\craw.py", "r");

    //PyRun_SimpleFileEx(fp, "craw.py", 1);
    if(PyRun_SimpleString(content.c_str()) != 0)
    {
        write_line("The main Python script contained errors.");
        return false;
    }

    //PyRun_SimpleString(("execfile('" + ail::replace_string(python_script, "\\", "\\\\") + "')").c_str());

    return true;

1 个回答

0

我解决了我的问题,方法是使用一个字符串向量,把文件中的每一行读到这个向量里,然后用 PyRun_SimpleString 来执行每一行。

这是完成的代码,不过没有进行错误检查。 std::vector string_vector; std::string content; if(python_script.empty()) return true;

    ail::read_lines(python_script, string_vector);

    if(!ail::read_file(python_script, content))
    {
        error("Failed to load Python script \"" + python_script + "\"");
        return false;
    }

    if(prompt_mode)
        initialise_console();

    content = ail::replace_string(content, "\r", "");

    Py_Initialize();
    initialise_module();

    std::string script_directory;
    if(get_base_name(python_script, script_directory))
        PyRun_SimpleString(("import sys\nsys.path.append('" + script_directory + "')\n").c_str());

    for(int i = 0; i < string_vector.size(); i++)
    {
        string_vector[i] = ail::replace_string(string_vector[i], "\r", "");
        PyRun_SimpleString(string_vector[i].c_str());
    }

    return true;

撰写回答