2013-05-14 60 views
4

我正在使用Python 2.7。我不清楚如何在Python中嵌入Python,如下所示:http://docs.python.org/2.7/extending/embedding.htmlC++ Python導入類;調用方法

我在這裏有一個名爲test.py文件的簡單Python的例子:

class math: 
    #def __init__(self): 
    def add(self, num1, num2): 
     return num1 + num2 

    def subtract(self, num1, num2): 
     return num1 - num2 

蟒蛇,我會做這樣的事情:

>>> 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類數學?

感謝

回答

8

這裏有一個快速N」用C其中確實相當於髒例子...

>>> import mymath 
>>> m = mymath.math() 
>>> print '1 + 2 = %d' % m.add(1, 2) 

請注意,我已經改名爲模塊從testmymath因爲有一個叫做模塊標準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_InitializePy_Finalize之間的Python/C API工作的任何重大的量,你必須看你的參考計數,並在適當時使用Py_INCREFPy_DECREF

+0

謝謝。完全按照預期工作。我做的唯一不同的是不包括setenv()調用。這在MSVS 2008 C++中似乎不可用,或者,我不知道在哪裏可以找到它。沒有它,測試運行良好。 – 2013-05-14 15:30:14

+0

@DooDah聽起來你的模塊已經在'PYTHONPATH'中了。在沒有'setenv'行的情況下,我在Ubuntu上從當前工作目錄導入時遇到了問題。 – Aya 2013-05-14 15:36:49

0

你不能導入一個類,但是你可以導入一個文件或庫(對於大多數語言來說都是如此) - 這正是你在test.py中所做的。

+0

問題是如何將一個python類導入到C++中。答案被標記爲正確的是解決方案。 – 2013-05-14 15:31:31