如何在导入 win32api 时修复“ImportError: DLL load failed”

Glx*_*xce 50 python winapi pip pywin32 python-3.x

我正在 Python 3.8 中设置一个自动点击器,我需要 win32api 来获取 GetAsyncKeyState 但它总是给我这个错误:

>>> import win32api
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed while importing win32api: The specified module could not be found.
Run Code Online (Sandbox Code Playgroud)

我使用的是 Windows 10 Home 64x。我已经试过了

pip install pypiwin32
Run Code Online (Sandbox Code Playgroud)

它成功安装但没有任何变化。我也尝试卸载并重新安装python。我也尝试以相同的方式安装 'django' 并且它在我时确实有效import django,所以我认为这只是一个 win32api 问题。

>>> import win32api
Run Code Online (Sandbox Code Playgroud)

我希望输出没有,但实际输出总是那个错误^^

小智 58

解决了

如果您在 conda 环境中使用 miniconda。您可以使用 conda 而不是 pip 来安装 pywin32。

这解决了我的问题:

conda install pywin32
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这为我解决了这个问题。我正在使用迷你康达。 (4认同)
  • 我们将以你的名义举办一个节日!赢得 10 64 位。浪费了几个小时......但多亏了这个,问题解决了。我激活的环境中的 conda install pywin32 不会影响 system32,并且它避免了运行由于找不到 wintypes DLL 而失败的安装后脚本的需要。不应该进入这种荒谬的状态(我不知道它是怎么发生的),也不应该花这么多功夫才能摆脱。不过谢谢谢谢谢谢谢谢。 (4认同)

小智 49

对于我的情况,安装并重新安装 pywin32 没有帮助。将两个文件从 复制[installation directory of Anaconda]\Lib\site-packages\pywin32_system32到 后C:\Windows\System32,它就可以工作了。

我的环境是 miniconda 中的 python 3.8。这两个文件是pythoncom38.dllpywintypes38.dll

  • 此信息有所帮助,但将第 3 方内容放入 C:\Windows\System32 中会导致未来的麻烦。例如,如果 pywin32 更新 DLL 并且在 pip 更新后不将它们再次复制到 C:\Windows\System32 ,会发生什么情况。您将得到一个不一致的系统。另外,计算机的所有程序都会“看到”这些DLL。您应该根据需要设置 PATH。 (2认同)

Jos*_*osé 29

在管理员命令提示符中运行 Scripts\pywin32_postinstall.py -install

参考:https : //github.com/mhammond/pywin32/issues/1431

编辑:用户@JoyfulPanda 发出警告:

以管理员权限运行此脚本还会将 pythoncom37.dll、pywintypes37.dll(对应于 pywin32 版本)复制到C:\WINDOWS\system32. 这稍后会在打开(在 Windows 上)“开始菜单 > Anaconda3(64 位)> Anaconda Prompt (a_virtual_env_name)”时导致问题。至少 Anaconda 2019.07 默认安装了 pywin32 223。Pywin32 224 可能工作,但 225-228 导致 Anaconda 出现问题 (2019.07)

  • pip install --upgrade pywin32==225 对我有用..Thx (20认同)
  • 要运行 pywin32_postinstall.py,您需要 `python pywin32_postinstall.py -install`,否则您将收到有关 winreg 的导入错误 (6认同)
  • 截至 2021 年 6 月 4 日,@Binu 解决方案也对我有用 (2认同)

Adi*_*ini 27

对我来说,它的工作原理是将我的 pywin32 从版本 227 降级到版本 224。只需在管理员模式下的任何 shell 上键入以下命令:

pip install --upgrade pywin32==224
Run Code Online (Sandbox Code Playgroud)

  • 对于 python 3.8,如果找不到 pywin32==224,请尝试 pywin32==225。这对我有用。 (15认同)
  • 您不能激活基本环境,只能激活您要使用的环境。从 228 降级到 225 对我来说很有效。```pip install --upgrade pywin32==225 有效``` (8认同)
  • `pip install pywin32==225` 也适用于 Python 3.9 (5认同)
  • 截至 2021 年 11 月,`pip install --upgrade pywin32==300` 有效,pwin32 版本 301、302 失败![所以社区成员应该因其 QA 服务而获得报酬:)] (3认同)
  • 我在Python3.8下收到此错误:无法找到满足要求的版本pywin32==224(来自版本:225、226、227、228) (2认同)

小智 12

答案在 jupyter notebook github 中。 https://github.com/jupyter/notebook/issues/4980

conda install pywin32为我工作。我使用的是 conda 发行版,而我的虚拟环境使用的是 Python 3.8


ocr*_*tte 7

Lib\site-packages\pywin32_system32不在要搜索 DLL(PATH 环境变量)的目录列表中时会发生这种情况。

pywin32(或其依赖项之一)在运行时将此路径添加到 PATH 变量。如果这失败了,或者其他组件在 pywin32 设置后覆盖了 PATH,您将收到给定的错误(ImportError: DLL load failed while importing win32api)。

在启动 Python 之前,您可以尝试在 shell 中扩展 PATH 变量。

在 Windows 上:

set PATH=c:\...\Lib\site-packages\pywin32_system32;%PATH%
Run Code Online (Sandbox Code Playgroud)

在类 Unix 系统上:

export PATH=c:\...\Lib\site-packages\pywin32_system32:$PATH
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,则 PATH 可能在运行时在 Python 程序中被覆盖。在 pywin32 用于验证其值之前,将以下行添加到您的程序中:

import os
print(os.environ["PATH"])
Run Code Online (Sandbox Code Playgroud)

作为最后的手段,您可以在加载 pywin32 之前扩展 PATH 变量:

视窗:

os.environ["PATH"] = r"c:\...\pywin32_system32;" + os.environ["PATH"]
Run Code Online (Sandbox Code Playgroud)

类Unix:

os.environ["PATH"] = r"/.../pywin32_system32:" + os.environ["PATH"]
Run Code Online (Sandbox Code Playgroud)

  • 我已将 'pywin32_system32' 的绝对路径添加到 os.environ['PATH'] 中,但仍然无法导入 win32api。只有将这两个dll复制到system32下才可以。 (2认同)
  • 也许是因为 3.8 中的这一变化:扩展模块的 DLL 依赖关系和 Windows 上使用 ctypes 加载的 DLL 现在可以更安全地解析。仅搜索系统路径、包含 DLL 或 PYD 文件的目录以及使用 add_dll_directory() 添加的目录来查找加载时依赖项。具体来说,PATH 和当前工作目录不再使用,对它们的修改将不再对正常的 DLL 解析产生任何影响。 (2认同)

小智 6

对于 python 3.8.3,pywin32==225 对我有用,现有的 pywin32==228 已卸载。

所以试试这个

pip install pywin32==225
Run Code Online (Sandbox Code Playgroud)

希望它能解决你的问题


Mic*_*low 5

根据 pywin32 github 你必须运行

pip install pywin32
Run Code Online (Sandbox Code Playgroud)

在那之后,你必须运行

python path\to\python\Scripts\pywin32_postinstall.py -install
Run Code Online (Sandbox Code Playgroud)

取自这里。为我工作!

  • 我认为这是所有可用解决方案中最正统的解决方案。它之所以有效,是因为需要安装额外的“pywin32”扩展。 (2认同)

小智 5

截至 2022 年 2 月,降级至版本 303pywin32解决了该问题。

检查你的 pywin32 版本:

pip show pywin32
Run Code Online (Sandbox Code Playgroud)

降级到版本300:

pip install pywin32==300 --upgrade
Run Code Online (Sandbox Code Playgroud)

重启Jupyter


Ana*_*eev 5

对我有帮助的是

  1. 从github.com/mhammond/pywin32安装相关二进制文件
  2. 在 x64 命令行中执行以下命令:

cd C:\ProgramData\Anaconda3\Scripts

python pywin32_postinstall.py -install