Fri*_*itz 8 c c++ python python-embedding python-c-api
我将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
Run Code Online (Sandbox Code Playgroud)
我过去曾经管理过(为了概念验证)使用以下类型的代码完成这项工作:
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);
Run Code Online (Sandbox Code Playgroud)
现在我处于更多的生产环境中,这在PyImport_Import行失败了 - 我想这可能是因为我正在尝试将目录添加到脚本名称中,例如
PyObject* pName = PyString_FromString("E:\\scriptlocation\\userscript.py");
Run Code Online (Sandbox Code Playgroud)
现在,为了让您了解我尝试过的内容,我尝试在所有这些调用之前修改系统路径以使其搜索此模块.基本上尝试以编程方式修改sys.path:
PyObject* sysPath = PySys_GetObject("path");
PyObject* path = PyString_FromString(scriptDirectoryName);
int result = PyList_Insert(sysPath, 0, path);
Run Code Online (Sandbox Code Playgroud)
这些行运行正常,但对我的代码工作没有任何影响.显然,我的真实代码有一大堆错误检查,我已经排除了所以不要担心!
所以我的问题是:如何将嵌入式解释器适当地引导到我的脚本中以便我可以实例化类?
she*_*pya 18
你需要指定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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4029 次 |
| 最近记录: |