C++ 调用C++;Python中的扩展
我试图用C++在MVC+++ 2010中扩展Python 3。我对这种事情完全陌生,而且我还不太精通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
#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,谢谢。)