【问题标题】:How to troubleshoot python import error - DLL access denied如何解决 python 导入错误 - DLL 访问被拒绝
【发布时间】:2018-08-14 02:37:55
【问题描述】:

我已经安装了某个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 日志不显示任何阻止活动。 Dependency walker 工具列出的依赖项要么是系统库,要么包含在“程序文件”文件夹中。

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

【问题讨论】:

    标签: python windows python-import administrator applocker


    【解决方案1】:

    经过长期的斗争,我现在有了解决办法。

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

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

    【讨论】:

    • 我想你的意思是Process Monitor(不是进程资源管理器——我不知道它在哪里有文件句柄日志记录)。我遇到过类似的情况,某些模块无法导入并出现“拒绝访问”错误,并且 Qt 应用程序(例如 spyder)无法打开。原来 QtCore5.dll 和某些模块的 __config__.py 没有普通用户的读/读+执行权限。
    【解决方案2】:

    这对我有用:

    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

    没有管理员权限也可以使用!

    【讨论】:

      【解决方案3】:

      这对我有用:关闭防火墙。我用的是360防火墙。在我关掉它之后,一切都很好,花花公子。 希望对您有所帮助

      【讨论】:

      • 很抱歉投反对票,但问题是关于如何调试,您没有为此提供答案。此外,不能关闭公司范围的安全策略(根据问题)。此外,关闭防火墙是不得已而为的临时解决方案。
      • 1.我了解您来自哪里,如果我的回答对您没有帮助,请见谅。
      猜你喜欢
      • 2021-09-14
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多