Cython . . (: , ++, . ).
: , (++ → Python).
quacker.py:
def quack():
print("Quack!")
cquacker.pyx:
from quacker import quack
cdef public void cquack():
quack()
main.cpp:
#if _WIN32
#include <direct.h>
#define getcwd _getcwd
#define PATH_SEPARATOR ';'
#else
#include <unistd.h>
#define PATH_SEPARATOR ':'
#endif
#include <iostream>
#include <string>
#include <sstream>
#include <Python.h>
#include "cquacker.h"
std::wstring getSysPath()
{
char cwd[FILENAME_MAX];
getcwd(cwd, FILENAME_MAX);
std::wstringstream path;
path << Py_GetPath() << PATH_SEPARATOR << cwd;
return path.str();
}
int main()
{
Py_Initialize();
PySys_SetPath(getSysPath().c_str());
PyInit_cquacker();
if (PyErr_Occurred())
{
PyErr_Print();
return -1;
}
cquack();
Py_Finalize();
return 0;
}
: , (++ → Python → ++).
quacker.py:
def qcallback(duck):
duck.quack()
quacker/Duck.hpp
#include <iostream>
namespace quacker {
class Duck
{
public:
void quack() { std::cout << "Quack!" << "\n"; }
};
}
cquacker_defs.pxd:
cdef extern from "quacker/Duck.hpp" namespace "quacker":
cdef cppclass Duck:
Duck() except +
void quack()
cquacker.pyx:
from cython.operator cimport dereference as deref
from libcpp.memory cimport shared_ptr
cimport cquacker_defs
from quacker import qcallback
cdef class Duck:
cdef shared_ptr[cquacker_defs.Duck] _this
@staticmethod
cdef inline Duck _from_this(shared_ptr[cquacker_defs.Duck] _this):
cdef Duck result = Duck.__new__(Duck)
result._this = _this
return result
def __init__(self):
self._this.reset(new cquacker_defs.Duck())
def quack(self):
assert self._this != NULL
deref(self._this).quack()
cdef public void cqcallback(shared_ptr[cquacker_defs.Duck] duck):
qcallback(Duck._from_this(duck))
main.cpp:
#if _WIN32
#include <direct.h>
#define getcwd _getcwd
#define PATH_SEPARATOR ';'
#else
#include <unistd.h>
#define PATH_SEPARATOR ':'
#endif
#include <iostream>
#include <memory>
#include <string>
#include <sstream>
#include "quacker/Duck.hpp"
#include <Python.h>
#include "cquacker.h"
std::wstring getSysPath()
{
char cwd[FILENAME_MAX];
getcwd(cwd, FILENAME_MAX);
std::wstringstream path;
path << Py_GetPath() << PATH_SEPARATOR << cwd;
return path.str();
}
int main()
{
Py_Initialize();
PySys_SetPath(getSysPath().c_str());
PyInit_cquacker();
if (PyErr_Occurred())
{
PyErr_Print();
return -1;
}
auto duck = std::make_shared<quacker::Duck>();
cqcallback(duck);
Py_Finalize();
return 0;
}