9 #ifndef PY_CPP_PYMODULE_HPP 10 #define PY_CPP_PYMODULE_HPP 18 #include <type_traits> 31 #ifndef PYCPP_WHICH_PYTHON 33 #define PYCPP_WHICH_PYTHON "/usr/local/bin/ipython" 38 #define PYCPP_PY_HOME "../.." 64 inline PyObject *
to_python(
const std::vector<int> &vec) {
66 PyObject *pyvec = PyList_New(n);
67 for (
int i = 0; i <
n; i++) {
68 PyList_SetItem(pyvec, i, PyLong_FromLong((
long) vec[i]));
79 inline PyObject *
to_python(std::vector<int> &&vec) {
81 PyObject *pyvec = PyList_New(n);
82 for (
int i = 0; i <
n; i++) {
83 PyList_SetItem(pyvec, i, PyLong_FromLong((
long) vec[i]));
94 inline PyObject *
to_python(
const std::vector<long> &vec) {
96 PyObject *pyvec = PyList_New(n);
97 for (
int i = 0; i <
n; i++) {
98 PyList_SetItem(pyvec, i, PyLong_FromLong((
long) vec[i]));
111 PyObject *pyvec = PyList_New(n);
112 for (
int i = 0; i <
n; i++) {
113 PyList_SetItem(pyvec, i, PyLong_FromLong((
long) vec[i]));
124 inline PyObject *
to_python(
const std::vector<double> &vec) {
126 PyObject *pyvec = PyList_New(n);
127 for (
int i = 0; i <
n; i++) {
128 PyList_SetItem(pyvec, i, PyFloat_FromDouble((
double) vec[i]));
141 PyObject *pyvec = PyList_New(n);
142 for (
int i = 0; i <
n; i++) {
143 PyList_SetItem(pyvec, i, PyFloat_FromDouble((
double) vec[i]));
154 inline PyObject *
to_python(
const std::vector<float> &vec) {
156 PyObject *pyvec = PyList_New(n);
157 for (
int i = 0; i <
n; i++) {
158 PyList_SetItem(pyvec, i, PyFloat_FromDouble((
double) vec[i]));
171 PyObject *pyvec = PyList_New(n);
172 for (
int i = 0; i <
n; i++) {
173 PyList_SetItem(pyvec, i, PyFloat_FromDouble((
double) vec[i]));
184 inline PyObject *
to_python(
const std::vector<std::string> &vec) {
186 PyObject *pyvec = PyList_New(n);
187 for (
int i = 0; i <
n; i++) {
188 PyList_SetItem(pyvec, i, PyUnicode_FromString(vec[i].c_str()));
199 inline PyObject *
to_python(std::vector<std::string> &&vec) {
201 PyObject *pyvec = PyList_New(n);
202 for (
int i = 0; i <
n; i++) {
203 PyList_SetItem(pyvec, i, PyUnicode_FromString(vec[i].c_str()));
216 return PyLong_FromLong((
long)num);
227 return PyLong_FromLong((
long)num);
238 return PyLong_FromLong(num);
249 return PyLong_FromLong(num);
259 return PyFloat_FromDouble((
double)num);
269 return PyFloat_FromDouble((
double)num);
279 return PyFloat_FromDouble(num);
289 return PyFloat_FromDouble(num);
299 return PyUnicode_FromString(str.c_str());
309 return PyUnicode_FromString(str.c_str());
319 return PyUnicode_FromString(str);
329 return PyUnicode_FromString(str);
334 cppobj = std::string(PyBytes_AsString(pyobj));
339 cppobj = (int) PyLong_AsLong(pyobj);
344 cppobj = PyLong_AsLong(pyobj);
349 cppobj = (float) PyFloat_AsDouble(pyobj);
354 cppobj = PyFloat_AsDouble(pyobj);
358 inline void from_python(PyObject *pyobj, std::vector<std::string> &cppobj) {
360 size_t len = PyList_Size(pyobj);
362 for (
size_t i = 0; i < len; i++){
363 PyList_GetItem(item, i);
364 cppobj.push_back(PyBytes_AsString(item));
369 inline void from_python(PyObject *pyobj, std::vector<int> &cppobj) {
371 size_t len = PyList_Size(pyobj);
373 for (
size_t i = 0; i < len; i++){
374 PyList_GetItem(item, i);
375 cppobj.push_back((
int)PyLong_AsLong(item));
380 inline void from_python(PyObject *pyobj, std::vector<long> &cppobj) {
382 size_t len = PyList_Size(pyobj);
384 for (
size_t i = 0; i < len; i++){
385 PyList_GetItem(item, i);
386 cppobj.push_back(PyLong_AsLong(item));
391 inline void from_python(PyObject *pyobj, std::vector<float> &cppobj) {
393 size_t len = PyList_Size(pyobj);
395 for (
size_t i = 0; i < len; i++){
396 PyList_GetItem(item, i);
397 cppobj.push_back((
float)PyFloat_AsDouble(item));
402 inline void from_python(PyObject *pyobj, std::vector<double> &cppobj) {
404 size_t len = PyList_Size(pyobj);
406 for (
size_t i = 0; i < len; i++){
407 PyList_GetItem(item, i);
408 cppobj.push_back(PyFloat_AsDouble(item));
421 inline PyObject *
make_tuple(std::initializer_list<PyObject *> l){
426 return PyTuple_Pack(0);
429 PyObject *out = PyTuple_New(num);
431 for (
int i = 0; i < num; i++){
432 PyTuple_SetItem(out, i, *(l.begin()+i));
452 return PyTuple_Pack(0);
455 PyObject *out = PyTuple_New(num);
457 for (
int i = 0; i < num; i++){
458 PyTuple_SetItem(out, i, *(l.begin()+i));
474 inline PyObject *
make_dict(std::initializer_list<PyObject *> l){
475 assert(l.size()%2 == 0);
483 PyObject *out = PyDict_New();
485 for (
int i = 0; i < num; i+=2){
486 PyDict_SetItem(out, *(l.begin()+i), *(l.begin()+i+1));
509 if (PyCallable_Check(obj)) {
512 std::string object(PyBytes_AsString(PyObject_Repr(obj)));
513 throw std::runtime_error(
"Object " +
object +
" not callable");
542 const std::string &py_home =
""){
544 if (!py_home.empty()){
545 setenv(
"PYTHONPATH", py_home.c_str(), 1);
548 setenv(
"PYTHONPATH", pycpp::python_home.c_str(), 1);
551 std::wstring wp = std::wstring(pycpp::which_python.begin(), pycpp::which_python.end());
552 Py_SetProgramName((
wchar_t *) wp.c_str());
554 if (!Py_IsInitialized()){
558 me = PyImport_ImportModule(package.c_str());
559 if (PyErr_Occurred()){
561 throw std::runtime_error(
"Unable to import package");
595 PyObject *kwargs = NULL){
596 assert(PyTuple_Check(args));
597 assert(kwargs == NULL || kwargs ==
nullptr || PyDict_Check(kwargs));
599 PyObject *callable = PyObject_GetAttrString(me, attr.c_str());
603 PyObject *retval = PyObject_Call(callable, args, kwargs);
604 if (PyErr_Occurred()){
612 PyDict_Clear(kwargs);
629 std::initializer_list<PyObject *> arg) {
633 PyObject *callable = PyObject_GetAttrString(me, attr.c_str());
637 PyObject *retval = PyObject_Call(callable, args, NULL);
638 if (PyErr_Occurred()){
659 std::initializer_list<PyObject *> arg,
660 std::initializer_list<PyObject *> kwarg) {
665 PyObject *callable = PyObject_GetAttrString(me, attr.c_str());
669 PyObject *retval = PyObject_Call(callable, args, kwargs);
670 if (PyErr_Occurred()){
691 (*this)(attr, cpp_retval, {});
711 PyObject *kwargs = NULL){
712 assert(PyTuple_Check(args));
713 assert(kwargs == NULL || kwargs ==
nullptr || PyDict_Check(kwargs));
715 PyObject *callable = PyObject_GetAttrString(me, attr.c_str());
719 PyObject *retval = PyObject_Call(callable, args, kwargs);
720 if (PyErr_Occurred()){
726 PyDict_Clear(kwargs);
747 std::initializer_list<PyObject *> arg){
751 PyObject *callable = PyObject_GetAttrString(me, attr.c_str());
755 PyObject *retval = PyObject_Call(callable, args, NULL);
756 if (PyErr_Occurred()){
783 std::initializer_list<PyObject *> arg,
784 std::initializer_list<PyObject *> kwarg){
789 PyObject *callable = PyObject_GetAttrString(me, attr.c_str());
793 PyObject *retval = PyObject_Call(callable, args, kwargs);
794 if (PyErr_Occurred()){
817 assert(args == NULL || args ==
nullptr || PyTuple_Check(args));
818 assert(kwargs == NULL || kwargs ==
nullptr || PyDict_Check(kwargs));
822 PyObject *pyclassname = PyObject_GetAttrString(me, klass.c_str());
826 out.
me = PyObject_Call(pyclassname, args, kwargs);
829 if (PyErr_Occurred()){
837 throw std::runtime_error(
"Class not imported!");
846 #endif //PY_CPP_PYMODULE_HPP ~py_object()
Definition: py_object.hpp:569
void operator()(const std::string &attr, T &cpp_retval, PyObject *args, PyObject *kwargs=NULL)
Definition: py_object.hpp:708
PyObject * operator()(const std::string &attr, std::initializer_list< PyObject *> arg, std::initializer_list< PyObject *> kwarg)
Definition: py_object.hpp:658
void from_python(PyObject *pyobj, std::string &cppobj)
String specialization.
Definition: py_object.hpp:333
void check_callable(PyObject *obj)
Definition: py_object.hpp:508
py_object(PyObject *obj)
Definition: py_object.hpp:530
Definition: py_object.hpp:497
void operator()(const std::string &attr, T &cpp_retval, std::initializer_list< PyObject *> arg, std::initializer_list< PyObject *> kwarg)
Definition: py_object.hpp:781
void operator()(const std::string &attr, T &cpp_retval)
Definition: py_object.hpp:689
PyObject * make_dict(std::initializer_list< PyObject *> l)
Makes a PyDict.
Definition: py_object.hpp:474
PyObject * to_python(const std::vector< int > &vec)
Takes a vector to a python list.
Definition: py_object.hpp:64
PyObject * make_tuple(std::initializer_list< PyObject *> l)
Makes a PyTuple.
Definition: py_object.hpp:421
PyObject * me
The core Python module.
Definition: py_object.hpp:499
Definition: layers.hpp:34
Definition: py_object.hpp:41
PyObject * operator()(const std::string &attr)
Definition: py_object.hpp:579
PyObject * operator()(const std::string &attr, PyObject *args, PyObject *kwargs=NULL)
Definition: py_object.hpp:593
#define PYCPP_WHICH_PYTHON
This allows us to use the python interpreter that CMake finds or overload it.
Definition: py_object.hpp:33
py_object(const std::string &package, const std::string &py_home="")
Definition: py_object.hpp:541
#define PYCPP_PY_HOME
Gives us a smart value for the home directory - again from the CMake source directory.
Definition: py_object.hpp:38
PyObject * operator()(const std::string &attr, std::initializer_list< PyObject *> arg)
Definition: py_object.hpp:628
void operator()(const std::string &attr, T &cpp_retval, std::initializer_list< PyObject *> arg)
Definition: py_object.hpp:745
py_object py_class(const std::string &klass, PyObject *args=NULL, PyObject *kwargs=NULL)
Definition: py_object.hpp:815
py_object()
Definition: py_object.hpp:522