1
pip install
代码语言:javascript复制python -m pip install pypiwin32
代码语言:javascript复制pip install win32com
代码语言:javascript复制python -m pip install pypiwin32
2
原因是PYTHON3.6未在HKEY_CURRENT_USERSOFTWAREPythonPythonCore写入3.6的信息
解决方法一:把下面的文本中路径改成自己的py3.6的,另存为.reg,然后导入
代码语言:javascript复制import sys
from winreg import *
# tweak as necessary
version = sys.version[:3]
installpath = sys.prefix
regpath = "SOFTWARE\Python\Pythoncore\%s\" % (version)
installkey = "InstallPath"
pythonkey = "PythonPath"
pythonpath = "%s;%s\Lib\;%s\DLLs\" % (
installpath, installpath, installpath
)
def RegisterPy():
try:
reg = OpenKey(HKEY_CURRENT_USER, regpath)
except EnvironmentError as e:
try:
reg = CreateKey(HKEY_CURRENT_USER, regpath)
SetValue(reg, installkey, REG_SZ, installpath)
SetValue(reg, pythonkey, REG_SZ, pythonpath)
CloseKey(reg)
except:
print ("*** Unable to register!")
return
print (" Python", version, "is now registered!")
return
if (QueryValue(reg, installkey) == installpath and
QueryValue(reg, pythonkey) == pythonpath):
CloseKey(reg)
print ("=== Python", version, "is already registered!")
return
CloseKey(reg)
print ("*** Unable to register!")
print ("*** You probably have another Python installation!")
if __name__ == "__main__":
RegisterPy()
代码语言:javascript复制Windows Registry Editor Version 5.00
[HKEY_CURRENT_USERSOFTWAREPython]
[HKEY_CURRENT_USERSOFTWAREPythonPythonCore]
[HKEY_CURRENT_USERSOFTWAREPythonPythonCore3.6]
[HKEY_CURRENT_USERSOFTWAREPythonPythonCore3.6Help]
@=""
[HKEY_CURRENT_USERSOFTWAREPythonPythonCore3.6HelpPythonwin Reference]
@="C:\Python\Python36\Lib\site-packages\PyWin32.chm"
[HKEY_CURRENT_USERSOFTWAREPythonPythonCore3.6InstallPath]
@="C:\Python\Python36"
[HKEY_CURRENT_USERSOFTWAREPythonPythonCore3.6PythonPath]
@="C:\Python\Python36;C:\Python\Python36\Lib\;C:\Python\Python36\DLLs\"
解决方法二:用下面PY脚本,3.X版本都可以通用,自动会添加当前版本的信息
222
代码语言:javascript复制import sys
from winreg import *
# tweak as necessary
version = sys.version[:3]
installpath = sys.prefix
regpath = "SOFTWARE\Python\Pythoncore\%s\" % (version)
installkey = "InstallPath"
pythonkey = "PythonPath"
pythonpath = "%s;%s\Lib\;%s\DLLs\" % (
installpath, installpath, installpath
)
def RegisterPy():
try:
reg = OpenKey(HKEY_CURRENT_USER, regpath)
except EnvironmentError as e:
try:
reg = CreateKey(HKEY_CURRENT_USER, regpath)
SetValue(reg, installkey, REG_SZ, installpath)
SetValue(reg, pythonkey, REG_SZ, pythonpath)
CloseKey(reg)
except:
print ("*** Unable to register!")
return
print (" Python", version, "is now registered!")
return
if (QueryValue(reg, installkey) == installpath and
QueryValue(reg, pythonkey) == pythonpath):
CloseKey(reg)
print ("=== Python", version, "is already registered!")
return
CloseKey(reg)
print ("*** Unable to register!")
print ("*** You probably have another Python installation!")
if __name__ == "__main__":
RegisterPy()
333
pycharm或者vscode或者win32版本
报错信息提示 win32com 模块没有 client
属性,于是我做了如下尝试,因为之前遇到过类似的情况,我首先考虑的是版本问题,卸载、重装,反反复复。
降低版本尝试
代码语言:javascript复制pip install pywin32==227
pip install pywin32==226
pip install pywin32==225
pip install pywin32==224
pip install pywin32==223
pip install pywin32==222
...
逐个降版本,依然不可行。
版本降到 222 时,提示缺少 Dll 文件,那是不是相关 C
的依赖需要更新完善呢,我检查电脑上的 Microsoft Visual C
相关依赖,貌似是不够全,于是我安装了相关的依赖。
完善 C 相关依赖
完善前我的电脑只要 2015 版本的依赖,如下图:
[图片上传失败...(image-c87c14-1597809584716)]
借用完善工具 MSVBCRT_AIO_2018.05.13_X86 X64.exe
,一次性完善相关依赖,傻瓜式操作,直接下一步即可,完善后结果如下:
image
这下全拉,再次运行,果然不出所料,仍然报同样的错误,下面先试试离线包方式安装。
离线包方式安装
前面尝试在命令行中安装的方式,并没有解决报错问题,现在试试离线包的方式:
1、先从 pypi
下载离线包 pywin32 228
版本,下载的文件名为 pywin32-228-cp36-cp36m-win32.whl
image
2、进入下载目录,打开命令行工具执行以下命令
代码语言:javascript复制pip install pywin32-228-cp36-cp36m-win32.whl
3、安装成功,报错仍然存在
源码浏览
在 win32com 模块中,明明可以看到 client 模块,为啥导入使用时,就会报错呢?
进入 win32com 的初始化文件中 __init__.py
文件中看看 ,首先导入 其他几个模块 win32api
、pythoncom
import win32api, sys, os
import pythoncom
其他代码也并没有找到相关的有用信息
改变策略
1、改变导包方式如下:
代码语言:javascript复制# 直接导入 win32com 下的 client
import win32com.client
app = win32com.client.Dispatch('Word.Application')
app.Visible = True
app.Documents.Open("F:\learning\wincom32_demo\demo.doc")
或者(与上面效果一样)
代码语言:javascript复制from win32com.client import Dispatch
app = Dispatch('Word.Application')
app.Visible = True
app.Documents.Open("F:\learning\wincom32_demo\demo.doc")
2、运作成功,可正常打开准备的 Word 文件,报错消除、问题解决
结语
通过一顿折腾,总算处理了这个 bug ,bug 虐我千百遍,我待 bug 如初恋。 回过头来,会发现,其实这只是一个小问题,但排查、处理起来却需要不少时间。
在日常工作、生活中,不也是如此吗,在经历众多尝试仍不能成功时,不妨停下脚步,静一静、思考些许,换个角度看待问题,改变策略处理问题,也许问题就可被轻松解决。
希望这次分享能给遇到类似问题的朋友一些帮助,更多相关文章请前往公号:可乐python说 ,再会。
444.前面都无效