引子
最近在用C++使用pybind11生成pyd以供python调用,并且使用opencv的dll,在测试过程中经常无法找到对应的文件。
pyd搜索路径
会在当前工作目录和PYTHONPATH环境变量中搜索,也可以通过sys.path.append()
临时添加变量:
sys.path.append('/path_to_pyd/')
备注:通过sys.path.append()
临时添加变量会导致pycharm中标注报错,但是能够正常运行。
在pycharm中可以在 设置 > 项目 > Python解释器 在下拉菜单中选择全部显示,选择使用的解释器并选择目录样式图标,将当前项目目录外(项目目录内的疑似不生效)的pyd路径添加进来即可,在项目目录里的外部库就可以看到添加的路径了,此时pyd可以被正确解析,并且不需要使用sys.path.append()
。
dll搜索路径
若python调用的pyd中调用了dll,若dll不在搜索路径中会产生如下报错:
ImportError: DLL load failed while importing xxx_module: 找不到指定的模块。
在所有python版本中,都会在包含pyd文件的目录中搜索dll,因此将dll复制到pyd所在文件即可。但我们也可以采用如下方法添加搜索路径。
在python3.8以下的版本中,使用使用环境变量PATH和来搜索,因此将dll路径添加到环境变量PATH即可,可以直接向系统添加PATH环境变量,或者也可以在程序中临时添加环境变量:
os.environ['path'] += '/path_to_dll/;'
在python3.8及以上版本中,不再使用使用环境变量PATH来搜索,需要使用os.add_dll_directory(path)
来添加dll搜索目录,关于此更新的说明可以查看这里。需要注意,os.add_dll_directory
的参数path仅支持绝对路径,且调用结束时失效。