Doo*_*Dah 5 c++ python python-c-api
我使用的是Python 2.7.我不清楚如何在C++中嵌入Python,如下所示:http://docs.python.org/2.7/extending/embedding.html.
我在一个名为test.py的文件中有一个简单的python示例:
class math:
#def __init__(self):
def add(self, num1, num2):
return num1 + num2
def subtract(self, num1, num2):
return num1 - num2
Run Code Online (Sandbox Code Playgroud)
从python,我会做这样的事情:
>>> from test import math
>>> m = math()
>>> a = m.add(1, 2)
>>> s = m.subtract(1, 2)
Run Code Online (Sandbox Code Playgroud)
我有一些C++代码的开头来做到这一点:
PyObject *pName, *pModule;
Py_Initialize();
pName = PyString_FromString("test");
pModule = PyImport_Import(pName);
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好.但是,这似乎相当于在Python中执行此操作:
import test
Run Code Online (Sandbox Code Playgroud)
如何导入Python类数学?
谢谢
Aya*_*Aya 11
这是C中的一个快速的例子,相当于......
>>> import mymath
>>> m = mymath.math()
>>> print '1 + 2 = %d' % m.add(1, 2)
Run Code Online (Sandbox Code Playgroud)
请注意,我已将模块重命名为test,mymath因为test在标准Python库中调用了一个模块.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <python2.7/Python.h>
int main()
{
setenv("PYTHONPATH", ".", 1);
Py_Initialize();
PyObject* module = PyImport_ImportModule("mymath");
assert(module != NULL);
PyObject* klass = PyObject_GetAttrString(module, "math");
assert(klass != NULL);
PyObject* instance = PyInstance_New(klass, NULL, NULL);
assert(instance != NULL);
PyObject* result = PyObject_CallMethod(instance, "add", "(ii)", 1, 2);
assert(result != NULL);
printf("1 + 2 = %ld\n", PyInt_AsLong(result));
Py_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...输出......
$ gcc foo.c -lpython2.7 && ./a.out
1 + 2 = 3
Run Code Online (Sandbox Code Playgroud)
但是,如果您在Py_Initialize和之间使用Python/C API进行任何大量工作,则Py_Finalize必须查看引用计数,Py_INCREF并Py_DECREF在适当时使用.