请教大家一个 pybind11 的问题 我在 c++代码中通过 pybind11 调用 py 脚本,在编译 c++程序的时候链接了指定版本的 python 库( python3.10 ),将 c++程序放到其他 windows 电脑上(已经安装了其他版本的 py,如 3.8 )运行时会提示找不到 python310.dll 。 这个问题如何解决,难道必须在客户机上也要安装相同版本的 python? 客户机可能其他软件以来 3.8 , 更新到其他版本可能导致其他软件运行不了。
请教大家一个 pybind11 的问题 我在 c++代码中通过 pybind11 调用 py 脚本,在编译 c++程序的时候链接了指定版本的 python 库( python3.10 ),将 c++程序放到其他 windows 电脑上(已经安装了其他版本的 py,如 3.8 )运行时会提示找不到 python310.dll 。 这个问题如何解决,难道必须在客户机上也要安装相同版本的 python? 客户机可能其他软件以来 3.8 , 更新到其他版本可能导致其他软件运行不了。
|
litanidJun 8, 2023
1
这里可以写字
|
|
yuiknsJun 8, 2023
2
是这样的。
你可以静态编译或者把依赖的 dll 打包一起 release |
|
ysc3839Jun 8, 2023 via Android
3
必须安装同版本 Python
|
|
billccnJun 8, 2023
4
Python 3 有一个稳定 API(stable API),但是有一些限制,而且可能会有一些性能损失,Pybind11 也没有明确支持它,不过好像是可以用的。
|
|
justouJun 8, 2023
5
windows 下有个 embed 版本的 python, 比如 https://www.python.org/ftp/python/3.10.11/python-3.10.11-embed-amd64.zip 可以把它看成一个绿色版 python(可以用 pip 在这个环境中安装管理第三方库), 相当于把 python 当成动态链接库来用, 可以随你的程序一起发布
|
|
neoblackcapJun 8, 2023
6
相同版本是必须的,这是两个东西。嵌入一个 python 呗,好比 sublime text 都是这样做。以前很多人用 boost.python 也这样搞
|
|
7
@billccn 感谢, 我试了下, cpython 有宏定义 Py_LIMITED_API, 如果我在项目中加了这个定义会导致 pybind11 报错, 感觉好像用不了, 晚点我再研究下
|
|
8
@justou @neoblackcap 感谢, 这应该是个办法, 晚点我试一下.
|
|
smirkcatJun 8, 2023
9
换个思路编译低版本,比如最低 python3.8 ,要求客户必须用 3.8 以上,正常来说,高版本可以用低版本 so
|
|
ysc3839Jun 8, 2023 via Android
10
@yoyoluck 说明 pybind11 不支持 Py_LIMITED_API ,这种情况你只能手动调用 Python 的 C API
|
|
penguinWWYJun 8, 2023
11
需要分发到别的机器的最好静态链接
|