我安装了一个python包(netCDF4),其中包含已编译的代码(扩展模块)。我在Windows 10(x64)下运行Anaconda和python 3.6。从控制台导入模块时,出现以下错误:
In [1]: import netCDF4
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-9588a3d4fb24> in <module>()
----> 1 import netCDF4
C:\Program Files\Anaconda3\lib\site-packages\netCDF4\__init__.py in <module>()
1 # init for netCDF4. package
2 # Docstring comes from extension module _netCDF4.
----> 3 from ._netCDF4 import *
4 # Need explicit imports for names beginning with underscores
5 from ._netCDF4 import __doc__, __pdoc__
ImportError: DLL load failed: Access is denied.
但该模块可以从管理员帐户中完美加载。
我怀疑一些关键的DLL文件被公司范围的安全策略阻止,这是非常严格的。例如,默认情况下会阻止二进制文件,除非在&#34;程序文件中#34;夹。但是我的python发行版和netCDF4包已经在这个文件夹中,所以我不知道怎么解释这个。 Windows事件查看器中的AppLocker日志不会显示任何阻止活动。由dependncency walker工具列出的依赖项是系统库或包含在&#34;程序文件&#34;文件夹中。
如何开始排查?我怎样才能知道发生了什么?
答案 0 :(得分:2)
经过长期的斗争,我现在有了解决方案。
我在管理模式下启动了python,并使用工具Process Explorer来记录加载了哪些DLL文件。 import netCDF4
语句加载了大约10个额外的DLL文件。然后我以用户模式启动python,并使用ctypes.WinDLL
手动加载每个库。然后,我能够确定导致问题的确切库(hdf5.dll
)。事实证明hdf5.dll
具有不完整的权限,因此只能加载管理员权限。
虽然我的问题非常具体,但我希望我的解决方案可以在相关情况下帮助其他人......
答案 1 :(得分:0)
这对我有用:
https://vxlabs.com/2017/12/06/how-to-debug-pyinstaller-dll-pyd-load-failed-issues-on-windows/
在Windows上调试DLL加载错误时,请使用lucasg的开源 以及对旧的Dependency Walker软件的更现代的重写。非常 重要的是,继续钻取间接依赖项,直到 您会找到丢失的DLL。
在此处下载:https://github.com/lucasg/Dependencies
也可以在没有管理员权限的情况下使用!
答案 2 :(得分:-1)
这对我有用:关闭防火墙。我正在使用360防火墙。我关掉电源后,一切都很好。 希望有帮助