C++ アプリケーションにさまざまなスクリプト言語を埋め込む実験を行ってきましたが、現在 Stackless Python 3.1 を試しています。アプリケーションから簡単なスクリプトを実行するために、いくつかのチュートリアルと例を試しましたが、見つけることができるものはほとんどありませんでした。
Py_Initialize();
FILE* PythonScriptFile = fopen("Python Scripts/Test.py", "r");
if(PythonScriptFile)
{
PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
fclose(PythonScriptFile);
}
Py_Finalize();
奇妙な理由で、このコードを実行すると、次の場所でアクセス違反が発生します。
PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
同様の問題を抱えている他の人をオンラインで検索しましたが、1つしか見つかりませんでした。彼らの唯一の解決策は、古いバージョンの Python でのみ可能と思われる回避策でした: Python ファイル オブジェクトを作成し、FILE*
その Python ファイル オブジェクトから をに返しますPyRun_SimpleFile
。このような関数呼び出しは利用できませんが、Python 3.1 API はファイル記述子からファイル オブジェクトを作成し、ファイル記述子を返しますが、PyRun_SimpleFile
関数には引き続きFILE*
.
ファイル全体を手動でメモリにロードし、それを巨大な文字列として実行する以外に、ファイルからスクリプトを実行する方法について途方に暮れています。確かに実用的な解決策ではありません。
何を与える?API に内部エラーがある場合、どうすればこのタスクを実行できますか?
更新: Stackless Python 3.1 をソースからビルドできましたが、同じ C ランタイム ライブラリを使用しているにもかかわらず、クラッシュはまったく変わっていません。私のプロジェクトと Stackless Python 3.1 ソースはどちらも、Visual Studio 2010 の C++ コンパイラと C ランタイムでビルドされています。FILE* ではなくファイル名を使用するように Python を変更する以外に、この問題を解決する方法については、もはや何も考えていません。別の恐ろしい回避策。