2012-03-21 54 views
8

我将Python嵌入到将定义API的C/C++应用程序中。嵌入式Python 2.7.2从用户定义的目录导入模块

应用程序需要实例化一个脚本定义的类,这是大致的结构是这样的:

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

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

所以我的问题:我如何直接将嵌入式解释器指向我的脚本,以便我可以实例化这些类?

回答

16

你需要指定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; 
} 
+1

非常感谢 - 这让我穿过了墙!现在来弄清楚我所调用的测试脚本有什么问题! – Fritz 2012-03-22 00:46:18

+0

在Python 3中,PyString_FromString消失了。改用PyBytes_FromString。 – edj 2017-06-27 15:44:09