2017-03-01 6 views
2

問題: PythonをC++で埋め込むと、奇妙な例外がスローされます。C++でのPythonの埋め込み

プログラム:

bool embedd::execute_python(std::string location) 
{ 
    if (std::ifstream(location)) 
    { 
      const char* file_location = location.c_str(); 
      FILE* file_pointer; 
      // Initialize the Python interpreter 
      Py_Initialize(); 
      file_pointer = _Py_fopen(file_location, "r"); 
      // Run the Python file 
      PyRun_SimpleFile(file_pointer, file_location); 
      // Finalize the Python interpreter 
      Py_Finalize(); 
     return true; 
    } 
    return false; 
} 

上記のコードは何をすべきん:関数は最初の引数が渡されたPythonのファイルの有効な場所であるかどうかを確認する必要があります。ファイルが存在する場合は、Pythonファイルを実行する必要があります。

期待通りの結果が得られますか:はい、いいえ。間違って何が起こっているか

テストファイル1:

print("Hello world") 

結果:正常に実行し、適切な出力に

テストファイル2取得:

from tkinter import * 
root = Tk() 
root.mainloop() 

Result : Exception root = Tk() File "C:\Users\User\AppData\Local\Programs\Python\Python35-32\Lib\tkinter__init__.py", line 1863, in init baseName = os.path.basename(sys.argv[0]) AttributeError: module 'sys' has no attribute 'argv'

他のファイルでテストしたところ、いつでも、tkinter、uuid、osなどのようなモジュール(any)がインポートされることが判明しました。同様の例外がスローされます。私が言及しているん3.5.2

リンク:これについて簡単に掘りに私のIDEのプロセスモニタは、例えばtk86t.dllため

Pythonのバージョンをロードしていないシンボルファイル「シンボルファイルがロードされていません」語りました: SO - 1いくつかの理由のために(窓C:\>python script.py -yourarguments用などのように)有効なコマンドラインを期待TkがバグはここのPython 2.3から修正されている一方、テストファイル2つの輸入にBUGS

答えて

2

を見つけました。一方、あなたはPythonを組み込み、したがってコマンドラインを持っていません。それはPythonが(「モジュール 'sys'は属性 'argv'を持たない」)文句です。あなたのテストファイル1はTkのインポートされませんので、有効なコマンドラインを期待していません

Py_Initialize(); 
wchar_t const *dummy_args[] = {L"Python", NULL}; // const is needed because literals must not be modified 
wchar_t const **argv = dummy_args; 
int    argc = sizeof(dummy_args)/sizeof(dummy_args[0])-1; 
PySys_SetArgv(argc, const_cast<wchar_t **>(argv)); // const_cast allowed, because PySys_SetArgv doesn't change argv 

:あなたは次のようなもので)Py_Initialize(直後に偽のコマンドラインを作成する必要があります。これが上のコードなしで動作する理由です。

+0

ありがとうございました!とても有難い! –