从python解释器中调用一个方法
calling a method from a python interpreter
根据Voo的建议:
我怎样才能"hook into"?Python从c++当它执行一个函数?我的目标是配置
我已经为一个新的问题打开了一个新的线程,这是,在c++中,我如何初始化一个PythonInterpreter,然后从它调用一个方法。具体来说,我希望能够调用cProfile的方法,并从中获取数据。
好吧,那就长一点了。请注意,我几乎忽略了所有"通常"的错误检查——几乎任何python方法都可能返回NULL,在这种情况下,您应该优雅地处理它。我展示了检查给定对象是否可调用的"异常"部分。注意,如果对象指针为NULL, PyDECREF会失败,Py_XDECREF则不会。现在到代码-可能有一个更好的方法来解决所有这些问题,但这对我来说很好,可悲的是文档非常缺乏。
c++代码:#include <Python.h>
static PyThreadState *mainstate;
void initPython(){
PyEval_InitThreads();
Py_Initialize();
mainstate = PyThreadState_Swap(NULL);
PyEval_ReleaseLock();
}
void exitPython(){
PyEval_AcquireLock();
PyThreadState_Swap(mainstate);
Py_Finalize();
}
void callScript() {
PyGILState_STATE gstate = PyGILState_Ensure();
PyObject *pName = PyUnicode_FromString("Startup");
PyObject *pModule = PyImport_Import(pName);
Py_DECREF(pName);
PyObject *pFunc = PyObject_GetAttrString(pModule, "startup");
if (pFunc && PyCallable_Check(pFunc)) {
PyObject *arglist = Py_BuildValue("(u)", "TestScript");
PyObject *result = PyObject_CallObject(pFunc, arglist);
Py_DECREF(arglist);
// Now you have the returned object of the function - do something with it.
// In our case that's None, but you should extend the python scrip to return
// whatever you need - see the profiler API.
Py_DECREF(result);
}
Py_XDECREF(pFunc); // XDECREF does not fail if pointer is NULL.
Py_DECREF(pModule);
PyGILState_Release(gstate);
}
int main() {
printf("Start.n");
initPython();
callScript();
exitPython();
printf("Exit.n");
return 0;
}
你的特定脚本总是被调用,改变它,这样你就能以一种有用的方式返回你想要的所有数据-目前我们只使用cProfile.run(),它只打印一些信息:
Startup.py
import cProfile
def startup(module_name):
print("Start script")
cProfile.run("import " + module_name)
print("Finished script")
最后执行的脚本:
TestScript.py
sum = 0
for i in range(10000):
sum += i
相关文章:
- 不能将方法返回的值用于另一个方法
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- 重写另一个方法 [C++] 使用的超类回调函数
- C++:如何使用传递引用在一个方法中返回多个值
- 为什么一个方法对同一个变量有常量和非常量参数?
- 从同一类中的另一个方法调用方法时出错
- 向现有类添加一个方法以逐行读取文件的内容
- 无法从派生的一个方法调用基类方法
- 如何将一个方法中的值返回到同一类的另一个方法
- 方法重载 C++ -> 只有一个方法调用
- 在另一个线程中执行一个方法
- 是否可以在另一个方法中使用模板类中定义的虚拟方法
- 调用方法,该方法修改字段,而使用该字段的另一个方法正在执行
- 将一个方法作为参数传递给另一个方法,该方法本身将传递的方法传递给 std 线程
- 仅专用于模板类的一个方法(部分)
- 确定一个方法是否是纯虚拟的(c++)
- 是否可以判断一个方法在编译时是否可以公开访问
- 我正在尝试创建一个方法,该方法使用指针算术返回一对,它是否会出错
- 从 ndk 中的 jni 方法调用另一个C++方法