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

我将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 

我过去曾经管理过(为了概念validation)使用以下类型的代码完成这项工作:

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

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

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

你需要指定userscript而不是userscript.py也使用PyImport_ImportModule它直接带一个char *

userscript.py表示包userscript模块py

这段代码适合我:

 #include  #include  #include  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; }