Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用C++;Python中的扩展_C++_Python - Fatal编程技术网

C++ 调用C++;Python中的扩展

C++ 调用C++;Python中的扩展,c++,python,C++,Python,我试图用C++在MVC+++ 2010中扩展Python 3。我对这种事情完全陌生,而且我还不太精通C++。根据之前在这里收到的python文档和帮助,我编写了以下代码,成功编译并运行: #include <Python.h> #include <iostream> using namespace std; static PyObject *SpamError; static PyObject *spam_system(PyObject *self, PyObject

我试图用C++在MVC+++ 2010中扩展Python 3。我对这种事情完全陌生,而且我还不太精通C++。根据之前在这里收到的python文档和帮助,我编写了以下代码,成功编译并运行:

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

static PyObject *SpamError;

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

static PyMethodDef SpamMethods[] = {
    {"system",  spam_system, METH_VARARGS,
     "Execute a shell command."},
    {NULL, NULL, 0, NULL}        /* Sentinel */
};

static struct PyModuleDef spammodule = {
   PyModuleDef_HEAD_INIT,
   "spam",   /* name of module */
   NULL,     /* 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
};



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

int main(int argc, wchar_t *argv[])
{
    // Add a builtin module, before Py_Initialize
    PyImport_AppendInittab("spam", PyInit_spam);

    // Pass argv[0] to the Python Interpreter
    Py_SetProgramName(argv[0]);

    // Initialise the Python interpreter
    Py_Initialize();

    // Import module
    PyImport_ImportModule("spam");

    cout << "test" << endl;
    system("PAUSE");
}
#包括
#包括
使用名称空间std;
静态PyObject*SpamError;
静态PyObject*spam_系统(PyObject*self,PyObject*args)
{
const char*命令;
int sts;
if(!PyArg_ParseTuple(args,“s”和命令))
返回NULL;
sts=系统(命令);
从长(sts)返回PyLong_;
}
静态PyMethodDef SpamMethods[]={
{“系统”、垃圾邮件系统、METH_Varags、,
“执行shell命令。”},
{NULL,NULL,0,NULL}/*哨兵*/
};
静态结构PyModuleDef spammodule={
PyModuleDef_HEAD_INIT,
“垃圾邮件”、/*模块名称*/
NULL,/*模块文档可能为NULL*/
-1、/*模块每个解释器状态的大小,
如果模块在全局变量中保持状态,则为-1*/
垃圾方法
};
PyMODINIT_FUNC
PyInit_垃圾邮件(无效)
{
PyObject*m;
m=PyModule_Create(&spammodule);
如果(m==NULL)
返回NULL;
SpamError=PyErr_NewException(“spam.error”,NULL,NULL);
Py_增量(SpamError);
PyModule_AddObject(m,“错误”,SpamError);
返回m;
}
int main(int argc,wchar_t*argv[])
{
//在Py_初始化之前添加一个内置模块
PyImport_AppendInittab(“spam”,PyInit_spam);
//将argv[0]传递给Python解释器
Py_SetProgramName(argv[0]);
//初始化Python解释器
Py_初始化();
//导入模块
PyImport_ImportModule(“垃圾邮件”);

cout我已经用boostpython实现了这一点。它构建了一个DLL或共享对象(取决于平台是Windows还是Linux)作为一个Python模块,您可以在Python中导入并像其他任何模块一样使用。它简单明了,工作可靠。您已经有了cpp文件和头文件,所以您只需编写包装器,公开您想从Python中使用的函数/方法/类。我将包装器放在我的cpp文件的底部。它们看起来像这:

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(my_module)
{
    boost::python::def("function_name", function, boost::python::args("start", "length", "offset", "boundry", "byte", "data", "variable" ), "docstring");
}
#包括
BOOST_PYTHON_模块(my_模块)
{
boost::python::def(“函数名”,函数,boost::python::args(“开始”,“长度”,“偏移量”,“边界”,“字节”,“数据”,“变量”),“docstring”);
}

就是这样。

我完全同意。学习C Python API的boost会更快,而且它将打开新的可能性世界。谢谢用户,但我以前尝试过下载boost,现在又尝试了一次,下载总是因为某种原因而中断。我下载的其他内容很少出现这种情况。我想没有人知道这是什么原因?我想它最终下载成功了。我会试试Boost,谢谢。)