嵌入式Python 2.7.2从用户定义的目录导入模块

时间:2012-03-21 23:46:23

标签: c++ python c python-c-api python-embedding

我将Python嵌入到将具有已定义API的C / C ++应用程序中。

应用程序需要实例化脚本中定义的类,这些类的结构大致如下:

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);

这些行运行正常,但对我的代码工作没有任何影响。显然,我的真实代码有一大堆错误检查,我已经排除了所以不要担心!

所以我的问题是:如何将嵌入式解释器适当地指向我的脚本,以便我可以实例化类?

1 个答案:

答案 0 :(得分:17)

您需要指定userscript而不是userscript.py也使用PyImport_ImportModule它会直接指定char *

userscript.py表示包py

中的模块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;
}