2012-02-24 64 views
0

我試圖延長Python 3的使用說明書規定here和我相當有信心,我按照說明正確,到目前爲止,但它要求我有這個代碼:擴展Python 3與C++

PyMODINIT_FUNC 
PyInit_spam(void) 
{ 
    PyObject *m; 

    m = PyModule_Create(&spammodule); 
    if (m == NULL) 
     return NULL; 

    SpamError = PyErr_NewException("spam.error", NULL, NULL); 
    Py_INCREF(SpamError); 
    PyModule_AddObject(m, "error", SpamError); 
    return m; 
} 

我在MSVC++ 2010中編寫它,它警告我& spammodule是未定義的(模塊的名稱是spammodule.cpp),但它沒有在指令中的任何地方定義它,所以我假設它應該識別它自動作爲模塊的名稱。

完整的代碼是:

#include <Python.h> 
#include <iostream> 
using namespace std; 

static PyObject *SpamError; 

int main() 
{ 
    cout << "Test" << endl; 
    system("PAUSE"); 
    return(0); 
} 

static PyObject *spam_system(PyObject *self, PyObject *args) 
{ 
    const char *command; 
    int sts; 

    if (!PyArg_ParseTuple(args, "s", &command)) 
     return NULL; 
    sts = system(command); 
    return PyLong_FromLong(sts); 
} 

PyMODINIT_FUNC 
PyInit_spam(void) 
{ 
    PyObject *m; 

    m = PyModule_Create(&spammodule); 
    if (m == NULL) 
     return NULL; 

    SpamError = PyErr_NewException("spam.error", NULL, NULL); 
    Py_INCREF(SpamError); 
    PyModule_AddObject(m, "error", SpamError); 
    return m; 
} 
+0

在C++中沒有這樣的模塊。在繼續之前,您可能會想重新開始閱讀一本優秀的C++書籍,您將爲自己節省很多挫折。 – 2012-02-24 23:41:22

+1

@SethCarnegie,他使用Python C API,所以C編程語言(第二版)應該足夠了。 – 2012-02-24 23:43:13

+0

我將在大學學習C++下一學期,儘管目前我在Python中完成一個項目的時間有限,所以我沒有太多時間學習C++,但謝謝。 – Tagc 2012-02-24 23:54:34

回答

2

你還在寫C++,所以你仍然需要聲明spammodule地方。這是後來在同一頁上給出:

static struct PyModuleDef spammodule = { 
    PyModuleDef_HEAD_INIT, 
    "spam", /* name of module */ 
    spam_doc, /* module documentation, may be NULL */ 
    -1,  /* size of per-interpreter state of the module, 
       or -1 if the module keeps state in global variables. */ 
    SpamMethods 
}; 
+0

謝謝你。 :) – Tagc 2012-02-24 23:54:43

1

不不不,PyModule_Create()接受一個指向模塊定義結構,並具有絕對無關,與源文件的名稱。

+0

謝謝,一些實際的代碼將非常有用。 – Tagc 2012-02-24 23:52:35