作为暑期实习的一部分,我目前正在为大型程序添加嵌入式 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 上运行。