我正在使用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
从python,我会做这样的事情:
>>> from test import math
>>> m = math()
>>> a = m.add(1, 2)
>>> s = m.subtract(1, 2)
我开始使用一些C ++代码来执行此操作:
PyObject *pName, *pModule;
Py_Initialize();
pName = PyString_FromString("test");
pModule = PyImport_Import(pName);
这似乎工作得很好。但是,这似乎相当于在Python中执行此操作:
import test
如何导入Python类数学?
由于
答案 0 :(得分:10)
这是C中的一个快速n'脏例子,相当于......
>>> import mymath
>>> m = mymath.math()
>>> print '1 + 2 = %d' % m.add(1, 2)
请注意,我已将模块从test
重命名为mymath
,因为标准Python库中有一个名为test
的模块。
#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;
}
...输出......
$ gcc foo.c -lpython2.7 && ./a.out
1 + 2 = 3
但是,如果您在Py_Initialize
和Py_Finalize
之间使用Python / C API进行了大量工作,则必须查看引用计数,并使用Py_INCREF
和适当时Py_DECREF
。
答案 1 :(得分:0)
你不能导入一个类,但是你可以导入一个文件或库(就像大多数语言一样吗?) - 这正是你在test.py中所做的。