gpt4 book ai didi

c++ - Python 嵌入 C++

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:44 25 4
gpt4 key购买 nike

所以我有一个 GUI 程序,其中有大量的“东西”在进行。我正在添加一个 python 脚本接口(interface),以便有人可以与此环境进行有问题的交互。我正在使用提升 python 。所以我首先要创建一个新模块。为简单起见,现在我的模块只是 hello world...

#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();
}
}
}

现在,当我在 GUI 中执行脚本时,出现错误...

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

所以我当然做错了。我的构建系统使用 autotools,所以这里有一些与此相关的构建系统......

在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/目录 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)

我的 makefile 构建了共享库,它与我的主程序一起位于 obj 文件夹中。这没有帮助。我还完成了 make install 以在 python 文件夹中安装 cerrnimapi 库。这没有帮助。

我也曾尝试将 PythonAPI.cpp 添加到我的主程序 SOURCES 但无济于事。

有什么想法吗?让我知道哪些附加信息会有所帮助。

最佳答案

一些要检查的东西:

  • 对您的 .so 文件(可能在 .libs 中)运行 nm 以确保您的模块初始化函数已导出。
  • 让您的程序打印出 sys.path 的值(使用 PyRun_SimpleString)以查看它期望您的模块出现的位置。如果您仅为解释器定义模块,您可能不想将它们安装在 $pyexecdir 中。
  • 阅读Extending Embedded Python文章。你根本不需要构建动态库,除非你正在尝试插件架构。

关于样式的一点:您应该尝试在 $PYTHON_INCLUDE$PYTHON_LD 的测试之外找到 $PYTHON_CONFIG,这样您不执行 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])
])

关于c++ - Python 嵌入 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13852880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com