代码之家  ›  专栏  ›  技术社区  ›  Tanner

如何使用PyRun运行读入std::string的python文件

  •  0
  • Tanner  · 技术社区  · 14 年前

    我把Python嵌入到C++程序中,并且非常有效地使用pyRuniSimuleScript,但是现在我遇到了麻烦。

    我所做的是加载了一个python.py文件std::string,但是现在运行它有困难。皮伦·斯普利菲利克斯似乎也没有做到这一点,所以有些帮助会很好!

        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 回复  |  直到 14 年前
        1
  •  0
  •   Tanner    14 年前

    我用一个字符串向量解决了我的问题,将文件的每一行读入向量,然后用PyRun_SimpleString执行每一行。

    std::矢量字符串; std::字符串内容; if(python_script.empty())

        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;