Python编织闪电DLL错误
我正在尝试使用weave.blitz来加速一些代码,但总是遇到以下DLL错误。如果我运行一段简单的代码,比如:
from scipy import * # or from NumPy import *
a = ones((512,512),'Float64')
b = ones((512,512),'Float64')
# now average
a[1:-1,1:-1] = (b[1:-1,1:-1] + b[2:,1:-1] + b[:-2,1:-1] \
+ b[1:-1,2:] + b[1:-1,:-2]) / 5.
from scipy import weave
expr = "a[1:-1,1:-1] = (b[1:-1,1:-1] + b[2:,1:-1] + b[:-2,1:-1]" \
"+ b[1:-1,2:] + b[1:-1,:-2]) / 5."
weave.blitz(expr)
我就会收到以下错误:
Traceback (most recent call last):
File "C:\Users\Thijs\wtest.py", line 19, in <module>
weave.blitz(expr)
File "C:\Python27\lib\site-packages\scipy\weave\blitz_tools.py", line 65, in blitz
**kw)
File "C:\Python27\lib\site-packages\scipy\weave\inline_tools.py", line 488, in compile_function
exec 'import ' + module_name
File "<string>", line 1, in <module>
ImportError: DLL load failed: Invalid access to memory location.
我使用的是最新的Pythonxy,通常在Spyder中写代码;不太确定这是否有关系。有没有什么建议?
2 个回答
抱歉在这么老的帖子里发言,我并没有提供一个有效的解决方案或对问题的解释,这只是一个评论。ImportError: DLL load failed: Invalid access to memory location.
我在尝试制作自己的用C语言编写的Python扩展时遇到了同样的错误,平台是32位的Windows。
这个错误真的很麻烦,因为它在所有Python环境中(比如Spyder、Notebook、普通控制台等)随机出现,无论是交互模式还是非交互模式。我是用MinGW和Python的distutils编译我的代码(命令是python setup.py install
)。编译过程中没有任何警告或错误,并且生成了正确目录下的pyd文件。但是当我尝试在Python代码中导入这个模块import example
时,它不规律地崩溃(通常只有五次尝试中有一次成功导入模块)。
奇怪的是,在另一台电脑上这个模块运行得很好……最后我找到了一种变通办法——我下载了一个更新版本的MinGW(之前我使用的是Qt SDK分发包中自带的版本),然后重新编译了这个模块。结果它就正常工作了,没有再崩溃。不过我没有找到任何系统性的解决方案或解释。所以我猜这可能和用来生成pyd文件的编译器有关(也许是缺少它的DLL文件?我也不太确定)。
我也在使用 Windows 7 下的 Python 2.7 64位和 weave.inline,遇到了和你描述的一样的问题。我在网上搜索了很久,但这个帖子似乎是唯一相关的,结果没有找到答案。
我追踪了 weave.inline 函数,尝试从编译好的二进制文件加载 pyd 文件。然后我发现,如果我执行以下命令,加载是成功的:
python -c "import sys; sys.path.insert(0, 'C:\\Users\\zliu\\AppData\\Local\\Temp\\zliu\\python27_compiled'); import sc_d4c0ee9cff8db6a9b5fc8352299944210;"
这里的模块名看起来像是某种哈希值。
但是如果我启动 Python 的交互模式,然后输入完全相同的语句,它就会显示:
ImportError: DLL load failed: Invalid access to memory location.
接下来,我尝试比较 python -c -v "..."
和 python -v
的输出,最后我找到了一个不同的地方:
import string
我不知道为什么 python -c
和 python
的交互模式在这一点上会不同,或者为什么没有这个模块时,导入会显示这么模糊的信息。但把它放在脚本的开头就对我有效了。