8

定義されたAPIを持つC/C++アプリケーションにPythonを埋め込んでいます。

アプリケーションは、スクリプトで定義されたクラスをインスタンス化する必要があります。クラスは、おおまかに次のように構成されています。

class userscript1:
    def __init__(self):
        ##do something here...

    def method1(self):
        ## method that can be called by the C/C++ app...etc

私は過去に(概念実証のために)次のタイプのコードを使用してこれを実行することに成功しました。

PyObject* pName = PyString_FromString("userscript.py");
PyObject* pModule = PyImport_Import(pName);
PyObject* pDict = PyModule_GetDict(pModule);
PyObject* pClass = PyDict_GetItemString(pDict, "userscript");
PyObject* scriptHandle = PyObject_CallObject(pClass, NULL);

私はより本番環境にいるので、これはPyImport_Import行で失敗しています-これは、スクリプト名の前にディレクトリを追加しようとしているためである可能性があります。

PyObject* pName = PyString_FromString("E:\\scriptlocation\\userscript.py");

ここで、私が試したことを理解するために、これらすべての呼び出しの前にシステムパスを変更して、このモジュールを検索するようにしました。基本的に、sys.pathをプログラムで変更してみました。

PyObject* sysPath = PySys_GetObject("path");
PyObject* path = PyString_FromString(scriptDirectoryName);
int result = PyList_Insert(sysPath, 0, path);

これらの行は正常に実行されますが、コードを機能させることには影響しません。明らかに、私の実際のコードには、除外したエラーチェックが大量に含まれているので、心配しないでください。

だから私の質問:クラスをインスタンス化できるように、埋め込まれたインタプリタをスクリプトに適切に向けるにはどうすればよいですか?

4

1 に答える 1

18

指定する必要があり、直接使用しuserscriptないでください。userscript.pyPyImport_ImportModulechar *

userscript.pypyパッケージ内のモジュールを意味しますuserscript

このコードは私のために働きます:

#include <stdio.h>
#include <stdlib.h>
#include <Python.h>

int main(void)
{
    const char *scriptDirectoryName = "/tmp";
    Py_Initialize();
    PyObject *sysPath = PySys_GetObject("path");
    PyObject *path = PyString_FromString(scriptDirectoryName);
    int result = PyList_Insert(sysPath, 0, path);
    PyObject *pModule = PyImport_ImportModule("userscript");
    if (PyErr_Occurred())
        PyErr_Print();
    printf("%p\n", pModule);
    Py_Finalize();
    return 0;
}
于 2012-03-22T00:15:14.317 に答える