Python, встроенный в переполнение стека

Так что у меня есть программа с графическим интерфейсом, в которой много чего происходит. Я добавляю интерфейс сценариев Python, чтобы кто-то мог проблематично взаимодействовать с этой средой. Я использую Boost Python. Итак, первое, что у меня есть, это новый модуль, который я хочу создать. Для простоты сейчас мой модуль просто привет мир …

#include <boost/python.hpp>

char const* greet() {
return "hello, world" ;
}

BOOST_PYTHON_MODULE(cerrnimapi) {
boost::python::def( "greet", greet ) ;
}

В моей системе у меня есть класс, который выглядит следующим образом …

Controller::Controller( ) {
Py_Initialize( ) ;

main_module = boost::python::import( "__main__" ) ;
main_namespace = main_module.attr( "__dict__" ) ;
}

void Controller::execute_script( std::string filename ) {
try {
boost::python::api::object ignored =
boost::python::exec_file( filename.c_str(), main_namespace ) ;
} catch( boost::python::error_already_set const & ) {
if (PyErr_ExceptionMatches(PyExc_ZeroDivisionError)) {
} else {
PyErr_Print();
}
}
}

Теперь, когда я иду, чтобы выполнить скрипт в графическом интерфейсе, я получаю сообщение об ошибке …

Traceback (most recent call last):
File "/home/mokon/repository/trunk/python.py", line 1, in <module>
import cerrnimapi
ImportError: No module named cerrnimapi

Поэтому, конечно, я строю что-то не так. Моя система сборки использует автоинструменты, так что вот несколько частей этой системы сборки, которые относятся к этому …

В configure.ac:

AM_PATH_PYTHON
AC_ARG_VAR([PYTHON_INCLUDE], [Include flags for python, bypassing python-config])
AC_ARG_VAR([PYTHON_CONFIG], [Path to python-config])
AS_IF([test -z "$PYTHON_INCLUDE"], [
AS_IF([test -z "$PYTHON_CONFIG"], [
AC_PATH_PROGS([PYTHON_CONFIG],
[python$PYTHON_VERSION-config python-config],
[no],
[`dirname $PYTHON`])
AS_IF([test "$PYTHON_CONFIG" = no], [AC_MSG_ERROR([cannot find python-config for $PYTHON.])])
])
AC_MSG_CHECKING([python include flags])
PYTHON_INCLUDE=`$PYTHON_CONFIG --includes`
AC_MSG_RESULT([$PYTHON_INCLUDE])
])

AC_ARG_VAR([PYTHON_LD], [Linker flags for python, bypassing python-config])
AS_IF([test -z "$PYTHON_LD"], [
AS_IF([test -z "$PYTHON_CONFIG"], [
AC_PATH_PROGS([PYTHON_CONFIG],
[python$PYTHON_VERSION-config python-config],
[no],
[`dirname $PYTHON`])
AS_IF([test "$PYTHON_CONFIG" = no], [AC_MSG_ERROR([cannot find python-config for $PYTHON.])])
])
AC_MSG_CHECKING([python linker flags])
PYTHON_LD=`$PYTHON_CONFIG --ldflags`
AC_MSG_RESULT([$PYTHON_LD])
])

В моем obj / dir Makefile.am …

pyexec_LTLIBRARIES = cerrnimapi.la
cerrnimapi_la_SOURCES = ${SRC_DIR}/lib/PythonAPI.cpp
cerrnimapi_la_LDFLAGS = -avoid-version -module $(PYTHON_LD)
cerrnimapi_la_CXXFLAGS = $(PYTHON_INCLUDE)

Мой make-файл собирает общую библиотеку и ее в папке obj вместе с моей основной программой. Это не помогает Я также сделал make install для установки библиотеки cerrnimapi в папки python. Это не помогает

Я также пытался добавить PythonAPI.cpp в мои основные программы SOURCES, но безрезультатно.

Есть идеи? дайте мне знать, какая дополнительная информация будет полезна.

1

Решение

Некоторые вещи, чтобы проверить:

  • Бежать nm над вашим .so файлом (который может быть в .libs), чтобы убедиться, что ваш модуль init func экспортирован.
  • Заставьте вашу программу распечатать значение sys.path (используйте PyRun_SimpleString), чтобы увидеть, где ожидается появление вашего модуля. Если вы определяете модули только для своего переводчика, вы, вероятно, не хотите устанавливать их в $pyexecdir,
  • Прочитайте Расширение встроенного Python статья. Вам вообще не нужно создавать динамические библиотеки, если только вы не пытаетесь создать плагинную архитектуру.

Точка стиля: вы должны попытаться найти $PYTHON_CONFIG за пределами ваших тестов для $PYTHON_INCLUDE а также $PYTHON_LD так что ты не делаешь AC_PATH_PROGS дважды:

AM_PATH_PYTHON
AC_ARG_VAR([PYTHON_CONFIG], [Path to python-config])
AS_IF([test -z "$PYTHON_CONFIG"], [
AC_PATH_PROGS([PYTHON_CONFIG],
[python$PYTHON_VERSION-config python-config],
[no],
[`dirname $PYTHON`])
])

AC_ARG_VAR([PYTHON_INCLUDE], [Include flags for python, bypassing python-config])
AS_IF([test -z "$PYTHON_INCLUDE"], [
AC_MSG_CHECKING([python include flags])
AS_IF([test "$PYTHON_CONFIG" = no], [AC_MSG_ERROR([cannot find python-config for $PYTHON.])])
PYTHON_INCLUDE=`$PYTHON_CONFIG --includes`
AC_MSG_RESULT([$PYTHON_INCLUDE])
])

AC_ARG_VAR([PYTHON_LD], [Linker flags for python, bypassing python-config])
AS_IF([test -z "$PYTHON_LD"], [
AC_MSG_CHECKING([python linker flags])
AS_IF([test "$PYTHON_CONFIG" = no], [AC_MSG_ERROR([cannot find python-config for $PYTHON.])])
PYTHON_LD=`$PYTHON_CONFIG --ldflags`
AC_MSG_RESULT([$PYTHON_LD])
])
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]