3

私はすでにグーグルと多くの参考文献を検索しましたが、コーディングの複雑な例しか見ていません。理解できるように例を教えてください(単純なコードで)。すでにコーディングしましたが、実行するたびに壊れますコードは次のとおりです

#include <Python.h>
int main()
{
  PyObject *pName, *pModule, *pDict, *pFun, *pValue;
  // Initialize the Python Interpreter
  Py_Initialize();
 // Build the name object
 pName = PyString_FromString("C:\\Documents and Settings\\MASTER\\My Documents\\Visual Studio       2010\\Projects\\Python\\Test.py");
if(pName)printf("OK");

// Load the module object
pModule = PyImport_Import(pName);

// pDict is a borrowed reference 
pDict = PyModule_GetDict(pModule);

// pFunc is also a borrowed reference 
pFun = PyDict_GetItemString(pDict, "prinTname");

if (PyCallable_Check(pFun)) 
{
    PyObject_CallObject(pFun, NULL);
} else 
{
    PyErr_Print();
}

// Clean up
Py_DECREF(pModule);
Py_DECREF(pName);

Py_DECREF(pDict);
Py_DECREF(pFun);
// Finish the Python Interpreter
Py_Finalize();
getchar();
return 0;
}

Python.exeの0x1e00503bでいくつかのメッセージファーストチャンス例外があります:0xC0000005:アクセス違反の読み取り場所0x00000004。Python.exeの0x1e00503bで未処理の例外:0xC0000005:アクセス違反の読み取り場所0x00000004。プログラム'[4548]Python.exe:Native'がコード0(0x0)で終了しました。

4

2 に答える 2

2

これが私が尋ねた質問からのいくつかのコードです。これはあなたが望むことをするはずです。

Args:argv[1]には.pyファイルへのパスが含まれていますargv[2]には呼び出したい関数の名前が含まれています

int wmain(int argc, wchar_t** argv)
{
    PyObject* py_imp_str;
    PyObject* py_imp_handle;
    PyObject* py_imp_dict; //borrowed
    PyObject* py_imp_load_source; //borrowed
    PyObject* py_dir; //stolen
    PyObject* py_lib_name; //stolen
    PyObject* py_args_tuple;
    PyObject* py_lib_mod;
    PyObject* py_func;
    PyObject* py_ret;

    Py_Initialize();

    //import our python script using the imp library (the normal import doesn't allow you to grab py files in random directories)
    py_dir = PyUnicode_FromWideChar(argv[1], wcslen(argv[1]));
    py_imp_str = PyString_FromString("imp");
    py_imp_handle = PyImport_Import(py_imp_str); //normal python import for imp
    py_imp_dict = PyModule_GetDict(py_imp_handle); //borrowed
    py_imp_load_source = PyDict_GetItemString(py_imp_dict, "load_source"); //borrowed
    py_lib_name = PyUnicode_FromWideChar(argv[2], wcslen(argv[2]));

    //setup args for imp.load_source
    py_args_tuple = PyTuple_New(2);
    PyTuple_SetItem(py_args_tuple, 0, py_lib_name); //stolen
    PyTuple_SetItem(py_args_tuple, 1, py_dir); //stolen

    //call imp.load_source
    py_lib_mod = PyObject_CallObject(py_imp_load_source, py_args_tuple);
    py_lib_mod_dict = PyModule_GetDict(py_lib_mod); //borrowed

    //get function object
    py_func = PyDict_GetItem(py_lib_mod_dict, py_lib_name);
    //call function object
    py_ret = PyObject_CallFunction(py_func, NULL);

    if (py_ret)
    {
        printf("PyObject_CallFunction from wmain was successful!\n");
        Py_DECREF(py_ret);
    }
    else
        printf("PyObject_CallFunction from wmain failed!\n");

    Py_DECREF(py_imp_str);
    Py_DECREF(py_imp_handle);
    Py_DECREF(py_args_tuple);
    Py_DECREF(py_lib_mod);

    Py_Finalize();

    fflush(stderr);
    fflush(stdout);
    return 0;
}

これをまだ見つけていない場合は、次のリンクでPythonへのCインターフェイスについて説明します。非常に便利です:http: //docs.python.org/2/c-api/index.html

于 2013-02-03T21:26:34.367 に答える
0

Python開発ツールをインストールしていない可能性があります。つまり、python.hが見つかりません。python.hを見つけて、コンパイルエラーを探し、エラーがある場合は再投稿します。

編集:これは古い情報です。インクルードは、インクルードディレクトリをインクルードディレクトリに追加するのと同じくらい簡単である必要があります。「VisualExpress 2010でpython.hヘッダーファイルを検索するにはどうすればよいですか?」を参照してください。

于 2012-10-28T13:43:15.387 に答える