2012-02-25 3 views
1

Я пытаюсь расширить Python 3 с помощью C++ в MSVC++ 2010. Я совершенно новичок в этом, и я еще не очень разбираюсь в C++. Исходя из питона документации и помощи я получил здесь раньше, я написал следующий код, который компилируется и работает успешно:Вызов расширений 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"); 
} 

Я все еще не уверен о нескольких вещах, хотя; мне нужно создать заголовочный файл для этого и как мне это сделать?

Кроме того, как я в конечном итоге должен был сделать это так, чтобы я вызывал расширение через оболочку python или внутри программы?

ответ

2

Я сделал это с помощью Boost Python. Он создает 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"); 
} 

Всё.

+1

Я больше не мог бы согласиться. Быстрее узнать, что C Python API в любом случае, и это откроет новый мир возможностей. – ixe013

+0

Спасибо, но я попытался загрузить Boost раньше и снова попробовать, и загрузка по какой-то причине прерывается. Это редко происходит с другим содержимым, которое я загружаю. Я не думаю, что кто-то знает причину этого? – Tagc

+0

Я думаю, что он наконец загружен успешно. Спасибо, спасибо. :) – Tagc

Смежные вопросы