使用C ++扩展Python 3

时间:2012-02-24 23:35:32

标签: c++ python

我正在尝试使用here给出的指令来扩展Python 3,我相信我到目前为止已经正确地遵循了说明,但是它要求我包含这些代码:

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;
}

2 个答案:

答案 0 :(得分: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
};

答案 1 :(得分:1)

否否,PyModule_Create()接受指向模块定义结构的指针,并且与源文件的名称完全无关。