2011-09-02 9 views
6
私は DocumentationごとにCのための組み込みのPythonを使って問題を抱えています

- 私は、インポートモジュールを使用してみてくださいたびに私が手:Pythonの埋め込み - インポートモジュール

PythonIncl.exeで0x1e089e85で

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

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

以下は私がうまくいかないチュートリアルのコード例ですが、ここで間違っていますか?

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 

私が使用してXPマシンを実行しています文脈のビット:OpenOPCを使用する小さなPythonスクリプトを非常に大きなCプログラムに埋め込み、2つの間でデータを転送したいと考えています。しかし、私はすでに基本例で概念実証テストに失敗しています。

+2

あなたはPythonのwhileの本文をインデントする必要がありますか? – Griwes

+1

Pythonを埋め込むのではなく、Pythonの拡張を書くことは、ほとんどの場合、より良く、より強力です。そうすることはかなり似ていますが、拡張のためのより良いツールがあり、必要に応じて他のPythonツールに簡単にアクセスできます。拡張と埋め込みの観点については、http://twistedmatrix.com/users/glyph/rant/extendit.htmlを参照してください。 –

+0

はい、転記中に失われた行方不明のインデントについては、IDEにあります。 – Shorkaa

答えて

14

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

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

モジュールの検索パスに現在のディレクトリを追加し、あなたの例を作成します。

+0

'PySys_SetPath("。 ")'は検索パスをクリア/上書きします。あなたはそれに[追加](http://stackoverflow.com/a/8859538/6394138)するのが良いでしょう。 – Leon

2

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