2012-02-25 4 views
1

私はMSVC++ 2010でC++でPython 3を拡張しようとしています。このようなことはまったく新しく、C++にも堪能ではありません。私はここで先に受信Pythonドキュメントやヘルプから続いて、私はコンパイルし、正常に実行され、次のコードを書いている:PythonでC++エクステンションを呼び出す

#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

私はそれが最終的に正常にダウンロードしたと思います。私はBoostに行く、ありがとう。 :) – Tagc