如何解决在导入win32api时出现“ImportError: DLL load failed”的问题

82

我正在使用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.

我正在使用Windows 10 Home 64位操作系统。我已经尝试过:

pip install pypiwin32

安装成功了,但是没有任何变化。我尝试卸载并重新安装Python,也尝试以同样的方式安装'Django',当我import django时它确实起作用,所以我认为这只是一个win32api问题。

>>> import win32api

我期望输出为空,但实际输出总是出现错误 ^^。

1
确保您没有依赖冲突!我通过pip安装了pywin32,它与我的Conda安装发生了冲突。 - Rashi Abramson
我认为这是由于缺少 pywin32 扩展引起的。 - Kris Stern
导入错误:导入 fputs 时 DLL 加载失败:找不到指定的模块。 - CS QGB
33个回答

103

解决方案

如果您正在使用conda环境中的miniconda,请使用conda而不是pip安装pywin32。

这解决了我的问题:

conda install pywin32

4
谢谢,这解决了我的问题。我正在使用Miniconda。 - Johannes Schmidt
在我的Win10、Python 3.9和Miniforge上运行良好。 - Ismael EL ATIFI
我必须在给定的conda环境中安装它(而不是在我运行jupyter笔记本的环境中)。尽管如此,它能够正常工作! - Piotr Migdal
4
我们将举办一个以你的名字命名的节日!赢得了64位操作系统。浪费了好几个小时...但是由于这个问题已经解决了。在我激活的环境中conda安装pywin32并没有影响到system32,这避免了运行postinstall脚本的需要,因为找不到wintypes DLL而导致失败。不应该有可能陷入这种荒谬的状态(我不知道它是如何发生的),而且不应该花这么多功夫才能摆脱困境。但是非常感谢你。 - Julian Moore

63

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

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


1
这个 Lib\site-packages\pywin32_system32 路径在哪里? - Sabito stands with Ukraine
它对我的问题起作用了。我也使用Python3.8。我想知道为什么会发生这种情况? - Lynn Han
3
这些信息很有帮助,但是把第三方文件放在 C:\Windows\System32 目录下会导致未来麻烦。比如说,如果 pywin32 更新了 DLL 文件而你没有在 pip 更新后再次复制到 C:\Windows\System32,那么你的系统就会出现不一致性。此外,所有计算机上的程序都会“看到”这些 DLL 文件。你应该根据需要设置 PATH 路径。 - ocroquette
在Jupyter Notebook中也完美地工作了。谢谢。 - Shravya Mutyapu
在管理员命令提示符下,进入Python的“Scripts”目录并运行“python -B pywin32_postinstall.py -install”。但是,如果您有多个“venv”,它们最好具有相同版本的_pywin32,否则当您切换时将会出现“Import Error”(使用“pip list”进行检查)。 请参阅此答案 - JimB
显示剩余4条评论

45

对于我来说,这个问题被解决了。我将我的pywin32版本从227降级到224。只需在管理员模式下的任何shell中输入以下命令:

pip install --upgrade pywin32==224

2
我在Python3.8下遇到了这个错误:无法找到满足要求pywin32==224的版本(可用版本为225、226、227、228)。 - Guido
26
对于 Python 3.8,如果找不到 pywin32==224 版本,请尝试 pywin32==225 版本。这个版本对我有效。 - Abhimanu Kumar
11
你不能激活基础环境,只能激活你想要使用的环境。对我而言,将版本从228降级到225有效。 pip install --upgrade pywin32==225 - Johannes Schmidt
5
pip install pywin32==225 同样适用于 Python 3.9。 - swimmer
3
截至2021年11月,“pip install --upgrade pywin32==300”是可行的,而pywin32版本301和302会失败!(SO社区成员应该因他们的QA服务获得报酬 :)) - Nir
显示剩余6条评论

39
在管理员命令提示符中运行Scripts\pywin32_postinstall.py -install
参考: https://github.com/mhammond/pywin32/issues/1431 编辑: 用户@JoyfulPanda发出警告:
运行此脚本时,具有管理员权限也会将pythoncom37.dll、pywintypes37.dll(对应于pywin32版本)复制到C:\WINDOWS\system32中,这实际上覆盖了Anaconda中已经存在的相应DLL版本。这之后,在Windows上打开"开始菜单> Anaconda3 (64位)> Anaconda Prompt(a_virtual_env_name)"时会出现问题。至少Anaconda 2019.07默认安装了pywin32 223。Pywin32 224可能有效,但225-228会对Anaconda(2019.07)造成问题。

7
运行pywin32_postinstall.py,你需要使用命令python pywin32_postinstall.py -install,否则你会得到一个关于winreg的importerror错误。 - gaborous
1
以管理员权限运行此脚本还会将pythoncom37.dllpywintypes37.dll(对应于pywin32版本)复制到C:\WINDOWS\system32\中,这实际上覆盖了已经存在的Anaconda相应DLL版本。这之后在Windows上打开“开始菜单> Anaconda3(64位)> Anaconda Prompt(a_virtual_env_name)”时会出现问题。至少Anaconda 2019.07默认安装了pywin32 223。Pywin32 224可能可以工作,但225-228会导致Anaconda(2019.07)出现问题。 - JoyfulPanda
22
"pip install --upgrade pywin32==225" 对我有用,谢谢。 - Binu
2
@Binu的解决方案对我也有效,截止于2021年6月4日。 - wtfzambo

14

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%
如果这不奏效,那么在Python程序运行时可能会覆盖PATH。在使用pywin32验证其值之前,请在程序中添加以下行:
import os
print(os.environ["PATH"])

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

Windows:

os.environ["PATH"] = r"c:\...\pywin32_system32;" + os.environ["PATH"]

类Unix操作系统:

os.environ["PATH"] = r"/.../pywin32_system32:" + os.environ["PATH"]

2
我已经将'pywin32_system32'的绝对路径添加到os.environ['PATH']中,但仍无法导入win32api。只有将这两个dll文件复制到system32中才能起作用。 - pansila
2
或许是由于3.8版本的这个变化:在Windows上,扩展模块和使用ctypes加载的DLL现在会更安全地解析DLL依赖项。只有系统路径、包含DLL或PYD文件的目录以及通过add_dll_directory()添加的目录会被搜索以获取加载时的依赖项。具体来说,不再使用PATH和当前工作目录,并且对这些的修改将不再对正常的DLL解析产生任何影响。 - ocroquette
感谢提供背景信息。此外,我不得不降级到224版本。 - tripleee
C:\ProgramData\Anaconda3>py Scripts\pywin32_postinstall.py -install ...Pythonwin已在上下文菜单中注册 正在创建目录C:\ProgramData\Anaconda3\Lib\site-packages\win32com\gen_py 无法安装快捷方式-'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Python 3.8'不是文件夹 pywin32扩展已成功安装。 - user3761555

13

在 Python 3.9.5 中对我有效。 - Shaida Muhammad

11

根据pywin32 github的说明,你必须运行

pip install pywin32

然后,你必须运行

python path\to\python\Scripts\pywin32_postinstall.py -install

这段内容取自这里,对我很有用!


2
我认为这是所有可用解决方案中最正统的解决方案。它能够工作是因为需要安装额外的 pywin32 扩展。 - Kris Stern
请查看此链接中的答案,该答案解决了关于Jupyter Notebook在Windows上无法启动的问题:link - Ian Thompson
这个解决方案适用于我,因为pywin32需要安装额外的扩展。 - Muhammad Arsalan Hassan

8
对于Python 3.8.3版本,pywin32==225可行,需要卸载现有的pywin32==228。因此,请尝试以下操作。
pip install pywin32==225

希望这能解决你的问题。

1
对我来说,类似的方法行得通。我从227降级到了226。而且像301这样的更新版本对我也没有用。 - j0da

5
截至2022年2月,将pywin32降级至303版本可解决此问题。
检查您的pywin32版本:
pip show pywin32

降级到版本300:

pip install pywin32==300 --upgrade

重启 Jupyter


5

对我有帮助的是

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

cd C:\ProgramData\Anaconda3\Scripts

python pywin32_postinstall.py -install


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