如何解决Python导入错误-DLL访问被拒绝问题。

7

我安装了一个特定的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文件被公司范围内的安全策略阻止了,这是相当严格的。例如,默认情况下会阻止二进制文件,除非在“程序文件”文件夹中。但我的Python分发和netCDF4包已经在此文件夹中,因此我不知道如何解释这一点。Windows事件查看器中的AppLocker日志没有显示任何阻止活动。由依赖项检查工具列出的依赖项要么是系统库,要么包含在“程序文件”文件夹中。

我该如何开始故障排除?我该如何找出发生了什么?

3个回答

3

3

经过长期的挣扎,我现在有了解决方案。

我以管理员模式启动了Python,并使用工具Process Explorer记录加载的DLL文件。导入netCDF4语句加载了大约10个额外的DLL文件。然后我以用户模式启动了Python,并使用ctypes.WinDLL手动加载了每个库。然后我能够准确定位导致问题的确切库(hdf5.dll)。原来hdf5.dll的权限不完全,只能在管理员权限下加载。

虽然我的问题非常具体,但我希望我的解决方案能帮助其他遇到类似情况的人......


2
我想你指的是进程监视器(不是进程资源管理器——我不知道它是否有文件句柄日志记录)。我曾经遇到过类似的情况,其中某些模块无法导入,出现“访问被拒绝”的错误,并且Qt应用程序(例如spyder)无法打开。事实证明,QtCore5.dll和某些模块的__config__.py没有为普通用户设置读取/读取+执行权限。 - chrstphrchvz

0
这对我有用:关闭防火墙。我使用的是360防火墙。在关闭它之后,一切都很好。 希望这可以帮到你。

很抱歉要投反对票,但这个问题是关于如何调试的,而你并没有提供答案。此外,公司范围的安全策略(根据问题)不能被关闭。另外,关闭防火墙只是最后的临时解决方案。 - akvilas
我理解你的想法,如果我的回答没有帮到你,很抱歉。 - user13695600

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接