如何解决 python 导入错误 - DLL 访问被拒绝

akv*_*las 7 python windows administrator python-import applocker

我已经安装了某个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.
Run Code Online (Sandbox Code Playgroud)

但该模块是从管理员帐户完美加载的。

我怀疑某些关键的 DLL 文件被公司范围内的安全策略阻止了,该策略的限制性相当大。例如,默认情况下,二进制文件会被阻止,除非位于“程序文件”文件夹中。但我的 python 发行版和 netCDF4 包已经在这个文件夹中,所以我不知道如何解释这一点。Windows 事件查看器中的 AppLocker 日志不显示任何阻止活动。depencency walker 工具列出的依赖项要么是系统库,要么包含在“程序文件”文件夹中。

我如何开始排除故障?我怎样才能知道发生了什么事?

akv*_*las 3

经过长时间的斗争,我现在有了解决方案。

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

虽然我的问题非常具体,但我希望我的解决方案可以帮助处于相关情况的其他人......

  • 我认为你的意思是 [Process **Monitor**](https://learn.microsoft.com/en-us/sysinternals/downloads/procmon) (不是 Process Explorer - 我不知道它在哪里有文件句柄日志记录)。我遇到过类似的情况,某些模块无法导入并出现“访问被拒绝”错误,并且 Qt 应用程序(例如间谍程序)无法打开。结果发现QtCore5.dll和某些模块的\_\_config\_\_.py没有普通用户的读/读+执行权限。 (2认同)