2012-03-29 55 views
2

在C++中的boost python嵌入,我有C++解析一個包含一個簡單函數的python(通過boost-python)文件,該函數又調用一個C++方法來完成某個實現。雖然這些看起來很荒謬,但我們選擇這樣做是爲了記錄日誌的優勢以及python提供的其他靈活性。我注意到,在Linux上,如果包含要實現的函數的python文件在Windows中編輯並因此在每行的末尾有惱人的回車符(^M),boost python無法解析它有語法錯誤。當然,運行dos2unix去除python文件中的^M字符可以解決此問題。在C++我升壓蟒蛇調用的代碼片段如下,如果它可以幫助:惱人的Ctrl + M問題解析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 s到實現特有的智能手柄上的一個typedef。我還注意到,直接在Linux中使用^M字符的文件上運行python並不會對解析器造成任何問題。任何想法,爲什麼如何解決^M問題,而不必運行dos2unix解決方法(希望在代碼中的修復),表示讚賞。謝謝。

回答

1

你可以定義一個函數,將刪除字符串0X0D性格,一樣的東西:

#include <algorithm> 

std::string removeWindowsLineEndings(std::string s) 
{ 
    s.erase(std::remove(s.begin(), s.end(), '\x0D'), s.end()); 

    return s; 
} 
+0

我會用'的boost :: replace_all'直接(升壓字符串算法)。 – 2012-03-29 06:19:33

+0

感謝fileoffset和matthieu。我的壞...我應該猜到了(這是令人尷尬的......應該對我的指節說唱)。 – 2012-03-29 15:01:55