15

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 を変更する以外に、この問題を解決する方法については、もはや何も考えていません。別の恐ろしい回避策。

4

7 に答える 7

14

これはPython 3で機能します:

 PyObject *obj = Py_BuildValue("s", "test.py");
 FILE *file = _Py_fopen_obj(obj, "r+");
 if(file != NULL) {
     PyRun_SimpleFile(file, "test.py");
 }

お役に立てば幸いです。

于 2012-03-09T05:17:04.830 に答える
13

同様のクラッシュが発生していましたが、以下を実行しました。

   PyObject* PyFileObject = PyFile_FromString("test.py", "r");
   PyRun_SimpleFileEx(PyFile_AsFile(PyFileObject), "test.py", 1);

ただし、これはpython 2.7にあったことに注意してください。API が 3.x で変更されたかどうかはわかりません。

于 2011-09-14T04:38:07.480 に答える
5

あなたのコードは、インストールしたバージョンの Python 2.6 で正しく動作します。また、ソースからスタックレス 3.1.2 をビルドしたところ、正しく動作しました。これは、Ubuntu 10.04 の g++ 4.4.3 で発生しました。Windows を使用している場合は、スタックレスとコードの両方が同じ C ランタイムに対してビルドされていることを確認することをお勧めします。

于 2010-09-06T23:53:43.473 に答える
3

これは、API の不一致の問題のように思えます。コードと Python ランタイムが異なるコンパイラまたは異なるコンパイラ オプションでコンパイルされた場合、FILE* にアクセスするとアクセス違反が発生する可能性があります。C コードが正しくビルドされていることを再確認できますか?

あなたは Python を C++ アプリケーションに埋め込んでいると述べています。Python は C コードであり、C コードとしてコンパイルされることに注意してください。おそらくそれが問題の原因ですか?

于 2010-09-06T22:55:22.583 に答える
0

VC 2010 でテストをビルドした場合、間違いなく問題が発生します。VC9 (VS 2008) と VC10 (VS 2010) には、相互に互換性のないサポート DLL があり、通常必要となります (printf、ファイル i/o などの実装)。Python ビルドが行う標準ライブラリが含まれている場合、それらを混在させることはできません。

gcc (Cygwin や mingw など) を使用するか、Visual Studio 2008 Express をダウンロードするかを常に選択できます。これは、python 埋め込みの実験には問題なく動作するはずです。標準の Python 2.7.6 ビルドで両方を使用しました。

于 2014-06-03T16:57:23.073 に答える
0

そして、このソリューションはどうですか:

Py_SetProgramName(argv[0]);
Py_Initialize();
PyRun_SimpleString("execfile(\"ex30.py\")");
Py_Finalize();

ex30.py私が実行しているpythonスクリプトの名前です。

于 2015-11-06T10:17:42.580 に答える