Добрый вечер всем!
Никак не могу разобраться с выполнением python кода из с++.
Задача следующая. Пишем свой модуль для python. Потом в c++ коде выполняем некий python код, использующий этот модуль. Потом надо преобразовать python объекты в c++ объекты.
Вот код:
/// pytest.cpp
/// build: g++ -std=c++1y -fPIC -I/usr/include/python3.4 -lboost_python -lpython3.4m pytest.cpp
/// bould: g++ -std=c++1y -fPIC -I/usr/include/python3.4 -lboost_python-py34 -lpython3.4m pytest.cpp
#include <string>
#include <iostream>
#include <boost/python.hpp>
using namespace boost::python;
int main() {
try {
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
// Тут import os нормально отработал
object tstObj = exec("print('This is Python code...')\n"
"import os\n"
"print(os.getcwd())\n",
main_namespace);
// А тут import mymodule не импортирует:
object testThree = exec("import mymodule\n"
"obj = mymodule.cppClass('i am a string member of cppClass')\n"
"obj.print()\n"
"\n",
main_namespace);
// Тоже не катит
object mymodObj = import("mymodule");
// Note that at this time you must not call Py_Finalize() to stop the interpreter. This may be fixed in a future version of boost.python.
// http://www.boost.org/doc/libs/master/libs/python/doc/html/tutorial/tutorial/embedding.html
// Py_Finalize();
} catch(error_already_set const &) {
if (PyErr_ExceptionMatches(PyExc_ZeroDivisionError)) {
// handle ZeroDivisionError specially
} else {
// print all other errors to stderr
PyErr_Print();
}
}
}
$ g++ -std=c++1y -fPIC -I/usr/include/python3.4 -lboost_python -lpython3.4m pytest.cpp && ./a.out
This is Python code...
/home/samson/cppPyhton
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named 'mymodule'
$ python
Python 3.4.2 (default, Oct 8 2014, 10:45:20)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymodule
>>> obj = mymodule.cppClass('i am a string member of cppClass')
8cppClass::cppClass(std::string)
>>> obj.print()
cppClass::print(): i am a string member of cppClass
import os выполняется нормально, а import mymodule - нет. Модуль mymodule создан и нормально импортируется из python:
Что я не так делаю? Как правильно сделать import?
ps: на всякий случай код модуля тут:
http://pastebin.com/L8VPvZbf
http://pastebin.com/QTqgxLc0