首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C++扩展Python3

使用C++扩展Python3
EN

Stack Overflow用户
提问于 2012-02-25 07:35:32
回答 2查看 2.1K关注 0票数 1

我正在尝试使用here给出的指令来扩展Python3,我非常有信心到目前为止我已经正确地遵循了这些指令,但它要求我包含以下代码:

代码语言:javascript
运行
复制
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),但是它没有在指令中定义它,所以我假设它应该自动将它识别为模块的名称。

完整的代码是:

代码语言:javascript
运行
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-25 07:39:17

您仍在编写C++,因此仍然需要在某个地方声明spammodule。这将在同一页的后面给出:

代码语言:javascript
运行
复制
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
};
票数 2
EN

Stack Overflow用户

发布于 2012-02-25 07:39:48

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9439581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档