2013-05-28 16 views
0

我目前正在爲一個大型程序添加嵌入式Python支持(是的,擴展不是選項),作爲我夏天的一部分實習。理想情況下,我可以將Python支持保存在一個.DLL文件中,該文件目前包含程序的內部腳本語言,並且是集成所述語言和Python的最簡單的地方。將Python 3.3嵌入到C++程序中,同時只能從輸入中一次讀取一行

但是,由於程序的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; 

我還沒有遇到嚴重的問題,這個技巧,但它讓我覺得不合時宜。任何人都可以想出一個更好的方法來做到這一點?

我已經與我的老闆清除了boost.python庫,如果這提供了一些有用的技巧,但沒有我。

編輯:我應該提到程序本身,而不是我微薄的測試牀,必須在MS Windows上運行。

+0

爲了澄清這裏,你是否試圖嵌入一個交互式解釋器外殼? – abarnert

回答

0

你寫的東西看起來表面上與股票解釋器相似,但它不會遵循與最微不足道的情況相同的縮進/縮進和延續規則。

嵌入交互式解釋器shell的最簡單方法是嵌入一個裸解釋器,該解釋器通常通過code模塊運行用純Python編寫的交互式解釋器。

爲了達到這個目的,你必須將你的逐行閱讀器連接到嵌入的stdin文件對象,但它似乎對於任何你想要的現實用途都是如此。 (否則,如果用戶在shell中鍵入input(),會發生什麼情況?)

另一種方法是設置pty並針對該操作運行股票交互式解釋器(可能作爲子進程) pty的線路閱讀器的輸入管道。

+0

這個初始代碼並不是要覆蓋每一個用例,當然也不是一個完整的解釋器;我需要爲完整的程序添加諸如續行支持之類的東西,但我不想這樣做,直到我確信上面的破解是唯一的方法。但是,對僞終端運行股票解釋器聽起來像是一個好主意。 –

+0

實際的程序需要在Windows上運行的事實也可能是一個問題;不知道該操作系統如何處理'pty's。 –

+0

@ J.T.Davies:Windows沒有pty's。有各種不同的方法來僞造它。當幾年前我不得不做類似的事情時,我寫了幾乎完全獨立的Windows代碼和其他代碼。 IIRC,Windows代碼不是僞裝成isatty,而是實際上啓動了一個真正的控制檯應用程序,它帶有一個隱藏的控制檯窗口作爲子進程,並與控制檯窗口交談,或者是類似的東西。但這可能只是必要的,因爲我不得不處理Win9x,現在希望它不是問題... – abarnert

相關問題