使用新版本Python(>=2.6)可能遇到如下错误,在动态链接的时候,ERROR: Failure: ImportError (DLL load failed: 找不到指定的模块。)
ERROR: Failure: ImportError (DLL load failed: 找不到指定的模块。)
如果遇到此种之错误,或是类似,那么
Traceback (most recent call last):
File "D:\Tools\Building\Python\lib\site-packages\nose-0.11.1-py2.6.egg\nose\loader.py", line 379, in loadTestsF
addr.filename, addr.module)
File "D:\Tools\Building\Python\lib\site-packages\nose-0.11.1-py2.6.egg\nose\importer.py", line 39, in importFro
return self.importFromDir(dir_path, fqname)
File "D:\Tools\Building\Python\lib\site-packages\nose-0.11.1-py2.6.egg\nose\importer.py", line 86, in importFro
mod = load_module(part_fqname, fh, filename, desc)
File "D:\svn\hgsubversion\tests\test_fetch_renames.py", line 4, in <module>
import test_util
File "D:\svn\hgsubversion\tests\test_util.py", line 20, in <module>
from hgsubversion import util
File "D:\svn\hgsubversion\hgsubversion\__init__.py", line 40, in <module>
from svn import core
File "D:\Tools\Building\Python\lib\site-packages\svn\core.py", line 19, in <module>
from libsvn.core import *
File "D:\Tools\Building\Python\lib\site-packages\libsvn\core.py", line 5, in <module>
ERROR: Failure: ImportError (DLL load failed: 找不到指定的模块。)
比如此时,最后一条语句
File "D:\Tools\Building\Python\lib\site-packages\libsvn\core.py", line 5, in <module>
表明当中的dll文件找不到,一般是不小心吧不应该命名成pyd的文件命名成了pyd。
比如当前libsvn下包含了如下文件
卷序列号为 284E-138E
D:.
client.py
client.pyc
core.py
core.pyc
delta.py
delta.pyc
diff.py
fs.py
libsvn_swig_py-1.dll
ra.py
ra.pyc
repos.py
wc.py
wc.pyc
_client.pyd
_core.pyd
_delta.pyd
_diff.pyd
_fs.pyd
_ra.pyd
_repos.pyd
_wc.pyd
__init__.py
__init__.pyc
这个是可以正常运行的文件结构
其中.pyd文件结尾的文件其实均是dll文件,只是rename了
但是为何 libsvn_swig_py-1.dll却没有重命名呢?
这里是有一个问题在里面的。。
首先。凡是已pyd 文件结尾为的都是.py文件里面直接import的
比如_core.pyd 在 core.py 里面有 import _core 这样的语句
而所有dll文件是不会直接被python调用的,所以必须添加到PATH路径里面,就是说只能够间接被.pyd文件应用,而不能直接被.pyd直接引用。
因此,如果下载的包中,诸如_core.dll _fs.dll 这种以_开头的大约是要被py文件引用的,所以要重命名为.pyd文件
而诸如libsvn_swig_py-1.dll文件则不能命名为.pyd文件后缀,同时这些文件所处的路径要添加到PATH中,否则会找不到。。
还有一个重要问题,就是程序的位不匹配,比如32为之于64为,这也是要重点考虑的,所以
在这种情况之下,要使用32位的,因为很多app都没有64位版本。。。。。
除非可以确定整个程序链都是64位的,这样才可以使用64位的程序
比如我就在这里遇到麻烦了,我用的subversion是64位的,python是64为的,
可是有一个东西不是,那就是subversion python bind 不是,所以无法正常的运行,也会出现这种load错误
就是说动态链接库也要是64位的才能够正常工作,dll hell
综上所述,就是这样子了。