Python3.8.3无法导入win32com.shell.shell,如何以管理员身份执行命令?
在Python 3.8.3(Windows 10)中以管理员身份执行Shell命令的解决方案
我刚好处理过从Python2到Python3的pywin32迁移问题,给你几个可行的方案,一步步解决:
一、先搞定pywin32的导入问题
首先,Python2的pywin32和Python3的版本不兼容,你得重新安装适配Python3.8的pywin32:
- 打开普通权限的命令提示符,执行这个命令:
pip install pywin32
安装完如果还是导入失败,大概率是没注册pywin32的组件,找到你Python3.8安装目录下的Scripts/pywin32_postinstall.py,运行:
python "C:\Python38\Scripts\pywin32_postinstall.py" -install
(把路径换成你实际的Python安装路径即可)
二、用pywin32继续执行提权命令
如果模块能正常导入了,你可以沿用类似Python2的代码,Python3里字符串默认是Unicode,不用额外处理编码问题:
import win32com.shell.shell as shell import win32con # 替换成你实际要执行的安装类命令 commands = "msiexec /i path/to/your/package.msi /qn" # 执行提权操作 shell.ShellExecuteEx( lpVerb='runas', lpFile='cmd.exe', lpParameters='/c ' + commands, nShow=win32con.SW_HIDE # 想看到cmd窗口就改成win32con.SW_SHOW )
三、不想折腾pywin32?试试自带的ctypes
要是还是遇到pywin32的适配问题,直接用Python自带的ctypes调用Windows原生API更稳定,完全不需要额外安装库:
import ctypes from ctypes import wintypes # 绑定Windows的ShellExecuteW API ShellExecuteW = ctypes.windll.shell32.ShellExecuteW ShellExecuteW.argtypes = [ wintypes.HWND, wintypes.LPCWSTR, wintypes.LPCWSTR, wintypes.LPCWSTR, wintypes.LPCWSTR, wintypes.INT ] ShellExecuteW.restype = wintypes.HINSTANCE # 窗口显示状态常量 SW_HIDE = 0 SW_SHOW = 5 def run_as_admin(command): # 调用API触发提权执行命令 result = ShellExecuteW( None, # 不需要父窗口,传None即可 "runas", # 关键:指定runas动词触发UAC提权 "cmd.exe", f"/c {command}", None, # 工作目录默认用当前目录 SW_HIDE ) # Windows API返回值大于32即为成功,小于等于32表示出错 if result <= 32: print(f"提权执行失败,错误码: {result}") else: print("提权命令已启动") # 示例调用(注意带空格的路径要加双引号) run_as_admin('"C:\\Program Files\\YourApp\\setup.exe" /silent')
几个实用小提醒
- 提权时Windows一定会弹出UAC提示框,这是系统安全机制,无法绕过(除非修改组策略,但不推荐这么做)。
- 如果命令里包含带空格的路径,一定要用双引号把路径包起来,否则cmd会解析出错。
- 调试阶段可以把窗口状态改成
SW_SHOW,方便查看命令执行过程,正式环境再改成SW_HIDE隐藏窗口。
内容的提问来源于stack exchange,提问作者thebadguy
相关产品推荐
相关产品推荐

