7

ドキュメントに従って C 用の埋め込み Python を使用すると問題が発生します- インポートされたモジュールを使用しようとすると、次のようになります。

PythonIncl.exe の 0x1e089e85 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000004。

エラーはPyObject_GetAttrString()メソッドで発生し、ドキュメントはあまり役に立ちません。IBM の例のようにチュートリアルも使用してみましたが、常に同じアクセス違反が発生します。

以下は、動作しないように見えるチュートリアルの 1 つからのサンプル コードです。ここで何が問題なのですか?

C コード (1 つのメイン ファイル内):

#include <Python.h>
int main()
{
    PyObject *strret, *mymod, *strfunc, *strargs;
    char *cstrret;
    Py_Initialize();
    mymod = PyImport_ImportModule("reverse");
    strfunc = PyObject_GetAttrString(mymod, "rstring");
    strargs = Py_BuildValue("(s)", "Hello World");
    strret = PyEval_CallObject(strfunc, strargs);
    PyArg_Parse(strret, "s", &cstrret);
    printf("Reversed string: %s\n", cstrret);
    Py_Finalize();
    return 0;
}

Python コード (reverse.py という名前のファイル内、同じフォルダー内):

def rstring(s):
    i = len(s)-1
    t = ''
    while(i > -1):
        t += s[i]
        i -= 1
    return t

MSVS2008、Python 2.7 を使用して XP マシンを実行しています

ちょっとしたコンテキスト: OpenOPC を使用する小さな python スクリプトをかなり大きな C プログラムに埋め込もうとしていて、2 つの間でデータを転送したいと考えています。ただし、基本的な例を使用した概念実証テストでは、すでに失敗しています。

4

2 に答える 2

16

呼び出しの結果を確認します。PyImport_ImportModule失敗して が返されますNULL。これは、デフォルトでは現在のディレクトリが検索パスに含まれていないためです。追加

PySys_SetPath("."); // before ..
mymod = PyImport_ImportModule("reverse");

現在のディレクトリをモジュール検索パスに追加して、例を機能させるには。

于 2011-09-02T13:41:48.943 に答える
2

エラーをチェックせずに先に進んでいるので、コードがこのように失敗してもショックはありません。あなたの説明から、 is のように聞こえますmymodNULL、これは失敗したインポートと一致します。インポートに失敗した原因として考えられるのは、reverse.py投稿した に構文エラーがあることです。

于 2011-09-02T13:38:54.253 に答える