crcmod._crcfunext导入不成功的解决方法

本人在学习阿里OSS的使用,我用的python环境。按教程指导,在安装完OSS库之后,在验证crcmod时出现问题。

>>> import crcmod._crcfunext
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'crcmod'

阿里文档是这么说的:

出现这种情况的原因是编译crcmod时,由于_crcfunext.so依赖Python.h文件,而系统中缺少这个头文件,因此_crcfunext.so库生成失败。CRC数据校验就会使用纯Python方式。虽然SDK安装成功,但是上传、下载等操作的效率非常低下。

对于Windows系统,如果出现该问题,请下载crcmod-1.7.win32-py2.7.msi或者其他版本的.msi文件进行安装,并在安装过程中指定crcmod的安装路径到您本地python安装路径下的Lib\site-packages文件夹,例如D:\python\Lib\site-packages\。安装完成后,再执行验证crcmod的步骤。

按照提示,去下载了crcmod-1.7.win32-py2.7.msi包,并安装,安装时,选择路径要选择到Lib上一层目录就好,如下图所示,这个安装程序会自己建立Lib/site-packages,否则路径会不对。

  安装好之后,在目录下已经有了_crcfunext.pyd了,如下图所示。

 

到这里,再import crcmod._crcfunext.pyd应该就可以成功了。但出现了以下问题:

>>> import crcmod._crcfunext
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed: 找不到指定的模块。

到这里蛋疼了好久。看了一下crcmod的文档,它说是在python3.1环境下测试了,而且已经好久没有更新过了。我用的是python3.7环境,所以问题可能出在了版本兼容上面。我的思路是在python3.7的环境下重新编译生成pyd文件替换,应该就可以了。

我是用gcc来编译的,如何构建gcc编译环境,请查阅相关资料。

在crcmod-1.7.win32-py3.1.msi的下载页面,找到其源码包crcmod-1.7.tar.gz下载。解压后,找到_crcfunext.c文件,如下图,并在同层目录下,按住Ctrl单击右键,选择在“在此处打开PowerShell窗口”。 

在PowerShell中,使用下面命令,用gcc生成.o文件:

gcc -c -I C:\Users\Hui\AppData\Local\Programs\Python\Python37-32\include -o _crcfunext.o _crcfunext.c

其中C:\Users\Hui\AppData\Local\Programs\Python\Python37-32\include为python安装目录下的include文件夹路径。

再使用gcc生成.pyd文件:

gcc -shared -L C:\Users\Hui\AppData\Local\Programs\Python\Python37-32\libs -o _crcfunext.pyd _crcfunext.o -lpython37

其中C:\Users\Hui\AppData\Local\Programs\Python\Python37-32\libs为python目录下libs文件夹路径。

没有问题的话,在文件夹下面会生成_crcfunext.pyd文件,将其替换python目录下的...Lib/site-packages/crcmod同名文件,再次验证,则不会再报错。

>>> import crcmod._crcfunext
>>>

到此,问题算是解决了。

 

在用pip卸载的时候发现卸载不了,如下图所示。提示使用distutils方法安装的模块,pip不能识别哪些文件属于它,所以不能卸载。

--> pip uninstall crcmod
Found existing installation: crcmod 1.7
ERROR: Cannot uninstall 'crcmod'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
-->

使用crcmod-1.7.win32-py3.1.msi安装包进行卸载,再用pip install crcmod安装,然后再将上面编译成功的_crcfunext.pyd拷进...Lib/site-packages/crcmod即可。

 

posted @ 2022-06-08 12:18  液体固态  阅读(857)  评论(2)    收藏  举报