DLL文件及conda模块加载失败

近期debug,同学在引入包(rasterio)的过程中频繁遇到DLL load failed while importing _version: 找不到指定的程序的问题,大部分情况都是因为包依赖的冲突/不适配问题

一般重新安装或者重新配置环境解决。

经分析此处大概也是Python环境中包的依赖版本及路径的冲突问题,一开始新建了3.9的环境能够运行,但是偶尔能用,未进一步深究,直接建议安装了3.9的miniconda替换了旧的3.7的Anaconda(该版本有点旧了),此处大概是因为基础环境中的3.7版本GDAL与新环境的冲突。旧版本的GDAL还需要自己设置路径。

DLL文件

Dynamic-link_library 动态链接库,也即是

wiki:是Microsoft在Microsoft Windows和OS/2操作系统中实现的共享库概念,与exe一样,DLL可以包含任意组合的代码、数据和资源。

  • 动态链接:程序在执行时从共享库中调用代码片段dll。The same architectural concept that allowed GDI to load different device drivers is that which allowed the Windows shell to load different Windows programs, and for these programs to invoke API calls from the shared USER and GDI libraries. That concept was "dynamic linking".
  • 共享:不同的应用程序可以调用同一个DLL即DLL 中的代码通常在所有使用 DLL 的进程之间共享
  • 好处:DLL 为共享代码和数据提供了一种机制,允许共享代码/数据的开发人员升级功能,而无需重新链接或重新编译应用程序。

与静态库一样,DLL 的导入库由.lib文件扩展名注明

Conda版本及包问题

不同包来源和依赖库版本不同,加上维护群体和更新快慢差异,因此直接安装多个包可能存在冲突。

这也是为什么建议通过pip conda之类的工具来进行包的管理,即有人帮我们做了一道版本的”审查”。建议是尽量使用主流的一些包,安装时优先使用conda-forge,如果还有问题先试试新建环境,一般能走通,或者也可以找到源码自己改写。

个人习惯使用miniconda3.9版本或者3.8作为基础环境进行环境管理,然后根据不同的工作新建常用的一些环境进行环境分离(而且新环境坏了也可以直接删掉重来),比如我个人会常建空间处理、文本处理、爬虫等几个环境进行使用,而不使用base,另外有特殊版本需求的任务可以新建如2.7 3.6 环境等

  • 之前写过Python入门、包以及conda环境管理,后续改改上传一下

安装包的时候建议通过谷歌搜索conda package名找到最佳安装命令(conda/或者在github),及优先使用conda-forge安装,没有的包则直接通过pip安装关于为什么建议使用conda-forge和不同包分法渠道的区别还可以看看这里官网,帖2

  • 设置默认渠道的方式:conda config --add channels conda-forge
  • 包来源渠道channels设置文件一般在用户文件处,如我的是C:/Users/huangs/.condarc

部分参考

  • Miniconda

  • https://conda-forge.org/docs/user/introduction.html

  • csdn