0

作为暑期实习的一部分,我目前正在为大型程序添加嵌入式 Python 支持(是的,扩展不是一种选择)。理想情况下,我可以将 Python 支持保留在单个 .DLL 中,该 DLL 目前包含程序的内部脚本语言,并且是集成所述语言和 Python 的最简单的地方。

但是,由于程序的 API,我只有一个输入函数可以使用。此函数的返回值是当前输入的单行,可以是控制台或文件。输入接口不能(在 .DLL 中)转换为流对象、缓冲区或 FILE 指针。

我当前的测试代码(在程序之外编写,使用 std::string、istream 和 getline 来模仿限制)是

// start python
Py_Initialize();

try
{
   cout << "Python " << Py_GetVersion() << endl;
   string block;
   bool in_block = false;
   while ( !cin.eof() )
   {
      string str;
      cout << (in_block ? "... " : ">>> "); // prompt string
      getline(cin,str);

      if ( in_block ) // if in an indented block
      {
         if ( str.front() != ' ' && str.front() != '\t' ) // if ending the indented block
         {
            PyRun_SimpleString(block.c_str());  // run Python code contained in block string
            block.clear();                      // clear string for next block
            in_block = false;                   // no longer in block
         }
         else // a component of an indented block
         {
            block += (str+'\n'); // append input to block string
            continue;            // do not pass block exit code, do not collect two hundred dollars
         }
      }

      // either not in an indented block, or having just come out of one
      if ( str.back() == ':' ) // if colon, start new indented block
      {
         block = (str+'\n');
         in_block = true;
         continue;
      }
      else { PyRun_SimpleString(str.c_str()); } // otherwise, run block-free code
   }
}
catch ( error_already_set e ) { PyErr_Print(); }

// close python
Py_Finalize();

// done
return 0;

我没有遇到这个 hack 的严重问题,但它让我觉得非常不优雅。谁能想到更好的方法来做到这一点?

我已经和我的老板一起清理了 boost.python 库,如果这提供了一些让我无法理解的有用技巧的话。

编辑:我可能应该提到程序本身,虽然不是我微薄的测试平台,但必须在 MS Windows 上运行。

4

1 回答 1

0

您所写的内容看起来与 stock 解释器表面上相似,但除了最微不足道的情况外,它不会遵循相同的缩进/缩进和延续规则。

嵌入交互式解释器 shell 的最简单方法是嵌入一个裸解释器,该解释器运行用纯 Python 编写的交互式解释器,通常通过code模块。

为此,您必须将逐行阅读器连接到嵌入式stdin文件对象,但对于任何实际用途,您似乎都需要这样做。(否则,例如,如果用户input()在 shell 上键入会发生什么?)

另一种方法是设置一个pty并针对它运行股票交互式解释器(可能作为子进程),从您的线路阅读器提供 pty 的输入管道。

于 2013-05-28T22:40:44.083 回答