请教大家一个 pybind11 的问题 我在 c++代码中通过 pybind11 调用 py 脚本,在编译 c++程序的时候链接了指定版本的 python 库( python3.10 ),将 c++程序放到其他 windows 电脑上(已经安装了其他版本的 py,如 3.8 )运行时会提示找不到 python310.dll 。 这个问题如何解决,难道必须在客户机上也要安装相同版本的 python? 客户机可能其他软件以来 3.8 , 更新到其他版本可能导致其他软件运行不了。
1
litanid 2023-06-08 01:14:20 +08:00
这里可以写字
|
2
yuikns 2023-06-08 04:29:28 +08:00
是这样的。
你可以静态编译或者把依赖的 dll 打包一起 release |
3
ysc3839 2023-06-08 04:42:24 +08:00 via Android
必须安装同版本 Python
|
4
billccn 2023-06-08 06:03:10 +08:00
Python 3 有一个稳定 API(stable API),但是有一些限制,而且可能会有一些性能损失,Pybind11 也没有明确支持它,不过好像是可以用的。
|
5
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 当成动态链接库来用, 可以随你的程序一起发布
|
6
neoblackcap 2023-06-08 09:08:19 +08:00
相同版本是必须的,这是两个东西。嵌入一个 python 呗,好比 sublime text 都是这样做。以前很多人用 boost.python 也这样搞
|
7
yoyoluck OP @billccn 感谢, 我试了下, cpython 有宏定义 Py_LIMITED_API, 如果我在项目中加了这个定义会导致 pybind11 报错, 感觉好像用不了, 晚点我再研究下
|
8
yoyoluck OP @justou @neoblackcap 感谢, 这应该是个办法, 晚点我试一下.
|
9
smirkcat 2023-06-08 09:42:57 +08:00
换个思路编译低版本,比如最低 python3.8 ,要求客户必须用 3.8 以上,正常来说,高版本可以用低版本 so
|
10
ysc3839 2023-06-08 10:01:44 +08:00 via Android
@yoyoluck 说明 pybind11 不支持 Py_LIMITED_API ,这种情况你只能手动调用 Python 的 C API
|
11
penguinWWY 2023-06-08 10:46:14 +08:00
需要分发到别的机器的最好静态链接
|