pybind11 链接 py 库版本的问题

2023-06-08 00:50:00 +08:00
 yoyoluck

请教大家一个 pybind11 的问题 我在 c++代码中通过 pybind11 调用 py 脚本,在编译 c++程序的时候链接了指定版本的 python 库( python3.10 ),将 c++程序放到其他 windows 电脑上(已经安装了其他版本的 py,如 3.8 )运行时会提示找不到 python310.dll 。 这个问题如何解决,难道必须在客户机上也要安装相同版本的 python? 客户机可能其他软件以来 3.8 , 更新到其他版本可能导致其他软件运行不了。

1331 次点击
所在节点    Python
11 条回复
litanid
2023-06-08 01:14:20 +08:00
这里可以写字
yuikns
2023-06-08 04:29:28 +08:00
是这样的。

你可以静态编译或者把依赖的 dll 打包一起 release
ysc3839
2023-06-08 04:42:24 +08:00
必须安装同版本 Python
billccn
2023-06-08 06:03:10 +08:00
Python 3 有一个稳定 API(stable API),但是有一些限制,而且可能会有一些性能损失,Pybind11 也没有明确支持它,不过好像是可以用的。
justou
2023-06-08 08:51:03 +08:00
windows 下有个 embed 版本的 python, 比如 https://www.python.org/ftp/python/3.10.11/python-3.10.11-embed-amd64.zip 可以把它看成一个绿色版 python(可以用 pip 在这个环境中安装管理第三方库), 相当于把 python 当成动态链接库来用, 可以随你的程序一起发布
neoblackcap
2023-06-08 09:08:19 +08:00
相同版本是必须的,这是两个东西。嵌入一个 python 呗,好比 sublime text 都是这样做。以前很多人用 boost.python 也这样搞
yoyoluck
2023-06-08 09:09:33 +08:00
@billccn 感谢, 我试了下, cpython 有宏定义 Py_LIMITED_API, 如果我在项目中加了这个定义会导致 pybind11 报错, 感觉好像用不了, 晚点我再研究下
yoyoluck
2023-06-08 09:11:02 +08:00
@justou @neoblackcap 感谢, 这应该是个办法, 晚点我试一下.
smirkcat
2023-06-08 09:42:57 +08:00
换个思路编译低版本,比如最低 python3.8 ,要求客户必须用 3.8 以上,正常来说,高版本可以用低版本 so
ysc3839
2023-06-08 10:01:44 +08:00
@yoyoluck 说明 pybind11 不支持 Py_LIMITED_API ,这种情况你只能手动调用 Python 的 C API
penguinWWY
2023-06-08 10:46:14 +08:00
需要分发到别的机器的最好静态链接

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/946785

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX