在C ++中使用boost python嵌入时,我使用C ++解析包含一个简单函数的python(通过boost-python)文件,该函数又调用C ++方法来完成某个实现。虽然这些看起来很荒谬,但我们选择这样做是因为日志记录的优势和python提供的其他灵活性。
我注意到在Linux上,如果包含要实现的函数的python文件是在Windows中编辑的,因此在每行的末尾都有恼人的回车符(^M
),boost python失败用语法错误解析它。当然,运行dos2unix
从python文件中删除^M
个字符可以解决此问题。如果有帮助的话,我在C ++中使用boost-python调用的片段如下:
bool exec_command(const std::string& cmd, ...) {
...
...
try {
boost::python::object main = boost::python::import("__main__");
boost::python::object global(main.attr("__dict__"));
if( !context.empty() ) {
boost::python::exec(
"import _project",
global,
global
);
for(smart_handle_context::const_iterator itr = handle_context.begin(); itr != hndle_context.end(); ++itr) {
global[itr->first] = boost::python::object(itr->second);
}
}
boost::python::exec(
cmd.c_str(),
global,
global
);
}
catch( boost::python::error_already_set& ) {
PyErr_Print();
return false;
}
return true;
}
在上面的代码片段中,smart_handle_context是std::string
到特定于实现的智能句柄的地图的typedef。我还注意到,在Linux上使用^M
个字符直接运行python对它的解析器没有任何问题。任何关于为什么如何绕过^M
问题而不必运行dos2unix解决方法(希望在代码中修复)的想法值得赞赏。感谢。
答案 0 :(得分:1)
您可以定义一个从字符串中删除0x0D字符的函数,如:
#include <algorithm>
std::string removeWindowsLineEndings(std::string s)
{
s.erase(std::remove(s.begin(), s.end(), '\x0D'), s.end());
return s;
}