首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C++应用程序封装Python,该应用程序使用pybind11嵌入Python

用C++应用程序封装Python,该应用程序使用pybind11嵌入Python
EN

Stack Overflow用户
提问于 2022-06-14 13:42:17
回答 1查看 48关注 0票数 0

我有一个C++应用程序,我试图使用pybind11来支持我的应用程序中的脚本系统,这样用户就可以编写自己的脚本了。我试图使用Python,就像许多人使用Lua作为脚本语言来扩展应用程序的功能一样。

在Lua /pybind11方面,我发现了一个很大的不同:使用Lua,我可以静态地将脚本语言链接到我的可执行文件中,甚至可以打包一个共享库,但是使用Python/pybind11,我似乎依赖于最终用户是否已经在他们的系统上安装了Python。

对吗?

有什么方法可以让pybind11静态地链接Python库吗?

pybind11似乎还会搜索python可执行文件的路径,然后假设共享库位于同一个文件夹中。有什么方法可以分发共享库,然后告诉嵌入式解释器使用这些共享库吗?

我的最终目标是用户可以在他们的机器上安装我的C++应用程序,我的应用程序将有一个内置的Python解释器,它可以执行脚本,而不管它是否实际安装在机器上。理想情况下,我可以使用静态链接来实现这一点,但是动态链接和分发所需的库也是可以接受的。

EN

回答 1

Stack Overflow用户

发布于 2022-06-14 15:04:40

  1. Pybind11不搜索Python可执行文件或类似的内容。您可以链接到libpythonX.Y.so.Z,它的工作方式与任何其他共享库一样。这样您就可以链接到您分发的Python库。您只需要确保您的可执行文件在运行时找到您的库。同样,这与分发任何其他共享库没有什么不同。使用rpath,或者在包装器脚本中使用LD_LIBRARY_PATH,或者其他什么。在SO (first hit).

上有很多关于它的问题和答案

  1. 您可以链接静态
  2. 库,如果您有一个可用的库。在我的系统(Ubuntu 20 x64)上,试图链接到libpython3.8.a会产生大量的重定位错误。系统库只在静态构建整个可执行文件时才能工作,即使用g++ -static ...,如果需要动态可执行文件,则需要使用-fPIC构建自己的静态Python库。为了记录在案,这里是我用来链接到系统库的命令。

g++ -static -pthread -I/usr/include/python3.8 example.cpp -lpython3.8 --ldl -lutil -lexpat -lz

  1. 最后但并非最不重要的一点是,如果您的用户想要编写Python脚本,他们可能已经安装了.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72618038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档