python实现自动打开终端并执行命令(windows)

news/2024/11/25 15:43:28/

python实现自动打开终端并执行代码(windows)

  • 一、环境和代码
    • 1. 安装pypiwin32
    • 2. 代码示例
  • 二、效果展示
  • 三、存在问题
    • 1. ImportError: DLL load failed while importing win32api: 找不到指定的模块。
    • 2. 窗口打开了但是不输入命令

最近有同学需要同时打开多个terminal并在其中执行不同代码的需求,linux中可以使用xterminal,但是windows就不行,需要手动打开多个终端,但这样费时费力,因此本文就自动打开终端并执行命令,给出下面的python代码。

一、环境和代码

1. 安装pypiwin32

在虚拟环境中安装pypiwin32的包,注意需要将pywin32的版本控制在305以下,否则会有坑(见第三部分第一个), 这里使用的是225版本:

pip install pypiwin32
pip install pywin32==225

2. 代码示例

直接上代码看看,如下所示,其实基本步骤就是:

    1. 定义一下不同键盘字符对应的code
    1. 定义自己需要输入的命令字符串
    1. 打开窗口
    1. 置顶窗口
    1. 输入指令执行
import subprocess
import sys
from time import *
import win32api
import win32con
import win32gui# 定义键盘的字符对应的16进制code
key_map = {"0": 0x30, "1": 0x31, "2": 0x32, "3": 0x33, "4": 0x34, "5": 0x35, "6": 0x36, "7": 0x37, "8": 0x38, "9": 0x39,'F1': 112, 'F2': 113, 'F3': 114, 'F4': 115, 'F5': 116, 'F6': 117, 'F7': 118, 'F8': 119,'F9': 120, 'F10': 121, 'F11': 122, 'F12': 123, 'F13': 124, 'F14': 125, 'F15': 126, 'F16': 127,"A": 65, "B": 66, "C": 67, "D": 68, "E": 69, "F": 70, "G": 71, "H": 72, "I": 73, "J": 74,"K": 75, "L": 76, "M": 77, "N": 78, "O": 79, "P": 80, "Q": 81, "R": 82, "S": 83, "T": 84,"U": 85, "V": 86, "W": 87, "X": 88, "Y": 89, "Z": 90,'BACKSPACE': 8, 'TAB': 9, 'TABLE': 9, 'CLEAR': 12,'ENTER': 13, 'SHIFT': 16, 'CTRL': 17,'CONTROL': 17, 'ALT': 18, 'ALTER': 18, 'PAUSE': 19, 'BREAK': 19, 'CAPSLK': 20, 'CAPSLOCK': 20, 'ESC': 27,' ': 32, 'SPACEBAR': 32, 'PGUP': 33, 'PAGEUP': 33, 'PGDN': 34, 'PAGEDOWN': 34, 'END': 35, 'HOME': 36,'LEFT': 37, 'UP': 38, 'RIGHT': 39, 'DOWN': 40, 'SELECT': 41, 'PRTSC': 42, 'PRINTSCREEN': 42, 'SYSRQ': 42,'SYSTEMREQUEST': 42, 'EXECUTE': 43, 'SNAPSHOT': 44, 'INSERT': 45, 'DELETE': 46, 'HELP': 47, 'WIN': 91,'WINDOWS': 91, 'NMLK': 144,'.':0xBE,'NUMLK': 144, 'NUMLOCK': 144, 'SCRLK': 145,'[': 219, ']': 221, '+': 107, '-': 109}num = 5
# 定义一下你要输入的命令字符串
cmds = [f'python node.py {num} n{i + 1}' for i in range(num)]
cmds.append(f'python tester.py {num}')
for cmd in cmds:# 打开cmdsubprocess.Popen('start C:\windows\system32\cmd.exe', shell=True)# sleep一下,因为windows11打开cmd比较慢,为了防止界面还没出现而误触,这样做一下比较保险sleep(0.2)#查找打开的窗口,findwindow(x,y)x是类别名,y是窗口标题n=win32gui.FindWindow('ConsoleWindowClass', None)# 置顶窗口p=win32gui.SetForegroundWindow(n)for chr in cmd:# print(chr.upper())# 按下按键win32api.keybd_event(key_map[chr.upper()], 0, 0, 0)win32api.keybd_event(13,0,0,0) #enterwin32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)

二、效果展示

在这里插入图片描述

如上图所示,我们就实现了打开多个命令窗口,并执行了我们想输入的指令,同样地,我们也可以用类似的方式打开其他的软件等。

三、存在问题

1. ImportError: DLL load failed while importing win32api: 找不到指定的模块。

这种一般就是win32api的版本太高了,一般需要低于302版本,可以用225或者226之类的低版本,解决方案如下:

    1. pip install pypiwin32
    1. pip install pywin32==225

2. 窗口打开了但是不输入命令

这种一般是因为没有捕获到窗口句柄或者是因为打开窗口太慢了,解决方案有两种:

  1. 使用微软的spy++工具来查看一下你即将打开的窗口的类名,以windows terminal为例:

在这里插入图片描述在这里插入图片描述
使用spy++中的查找功能,我们可以指导对应程序的类和标题,帮助我们使用findwindow函数定位句柄,这里可以看出,cmd的类名是ConsoleWindowClass,但是部分笔记本的win11上的cmd并不是这个类名,所有需要注意!!!!

  1. 窗口打开的太慢
    这个时候修改一下sleep的时间(单位是s),给窗口打开留点时间。
    在这里插入图片描述

http://www.ppmy.cn/news/430655.html

相关文章

scorll

关闭 微信平台 <script type"text/javascript">function closeDiv() {document.getElementById(floater).style.visibility hidden;}self.onError null;currentX currentY 0;whichIt null;lastScrollX 0; lastScrollY 0;NS (document.layers) ? 1 : 0…

scoket

我们深谙信息交流的价值&#xff0c;那网络中进程之间如何通信&#xff0c;如我们每天打开浏览器浏览网页 时&#xff0c;浏览器的进程怎么与web服务器通信的&#xff1f;当你用QQ聊天时&#xff0c;QQ进程怎么与服务器或你好友所在的QQ进程通信&#xff1f;这些都得靠socket&a…

Slick教程

Slick 编程(1): 概述Slick 编程(2): 准备开发环境Slick 编程(3): 基本查询Slick 编程(4): 数据库连接和事务处理Slick 编程(5): 数据库SchemaSlick 编程(6): 查询(一)Slick 编程(7): 查询(二)Slick 编程(8): 查询(三)Slick 编程(9): 直接使用SQL语句

Screeps

文章目录 前言一、Screeps是什么&#xff1f;二、部分介绍1.CreepsCreeps 能力移动力 2.控制全局控制等级房间控制等级 3.防御你的房间安全模式 三、链接 前言 篇幅有限&#xff0c;就不全部转载。 此文为系列文章第一篇 以下内容全部来自Screeps官网 API文档 在Steam上有售…

saga模式、Seata saga模式详解

文章目录 一、前言二、SAGA模式0、saga论文摘要1、什么是长事务?2、saga的组成3、saga的两种执行场景1)forward recovery2)backward recovery4、saga log5、saga协调(saga实现方式)1)SAGA - Choreography 策略2)SAGA - Orchestration 策略3)如何选择三、Seata saga模式…

【记忆集与卡表】

文章目录 1. 程序计数器&#xff08;Program Counter Register&#xff09;2. 虚拟机栈&#xff08;VM Stack&#xff09;3. 本地方法栈&#xff08;Native Method Stack&#xff09;4. Java堆&#xff08;Java Heap&#xff09;5. 方法区&#xff08;Method Area&#xff09;记…

面经2021

算法 剑指offer 面试必考真题——手撕代码 递归和非递归求解字符组合 找出给定无序数组中未出现的最小正数:双指针 岛屿数量bfs dfs 并查集 字符串编辑距离 求最长回文子串 sort函数的实现原理 m x n棋盘&#xff0c;只能向下向右走&#xff0c;从左上角到右下角有几种走法 m…

Php+mysql社区交流系统(毕业论文+封面目录+系统+说明书)

随着计算机网络的不断发展,网页逐渐融入人们的生活。快速及时的新闻浏览,五彩缤纷的网上信息,使网络与人们的生活息息相关,于是世界上又出现了第三媒体——Internet。它打破了地域限制,真正使信息得以共享,改变了人们的工作和生活方式。官方网页是企业和个人的宣传自己的…