Pythonは自動的にターミナルを開いてコードを実行することを実現します(Windows)
最近、複数のターミナルを同時に開いて、その中で異なるコードを実行する必要がある学生がいます。Linux では xterminal を使用できますが、Windows では使用できません。複数のターミナルを手動で開く必要がありますが、これは時間と労力がかかるため、この記事では、以下の Python コードを指定すると、自動的にターミナルが開き、コマンドが実行されます。
1. 環境とコード
1.pypiwin32をインストールする
pypiwin32 パッケージを仮想環境にインストールします。pywin32 のバージョンは 305 未満に制御する必要があることに注意してください。そうしないと、落とし穴が発生します (パート 3 の最初の部分を参照)。ここでは 225 バージョンが使用されています。
pip install pypiwin32
pip install pywin32==225
2. コード例
以下に示すコードを見てください。実際、基本的な手順は次のとおりです。
-
- さまざまなキーボード文字に対応するコードを定義する
-
- 入力する必要があるコマンド文字列を定義します
-
- ウィンドウを開く
-
- ウインドウ上部
-
- コマンド実行に入る
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:
# 打开cmd
subprocess.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) #enter
win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)
2.エフェクト表示
上の図のように複数のコマンドウィンドウを開いて入力したい命令を実行しましたが、他のソフトウェアも同様の方法で開くことができます。
3. 問題点
1. ImportError: win32api のインポート中に DLL のロードに失敗しました: 指定されたモジュールが見つかりません。
これは通常、win32api のバージョンが高すぎることを意味します。通常、バージョン 302 より低い必要があります。225 や 226 などの低いバージョンを使用できます。解決策は次のとおりです。
-
pip install pypiwin32
-
pip install pywin32==225
2. ウィンドウは開いていますが、コマンドが入力されていません。
これは通常、ウィンドウ ハンドルがキャプチャされていないか、ウィンドウを開くのが遅すぎることが原因で発生します。解決策は 2 つあります。
- Microsoft のspy++ツールを使用して、開こうとしているウィンドウのクラス名を確認します。Windows ターミナルを例に挙げます。
spy++ の検索機能を使用すると、対応するプログラムのクラスとタイトルをガイドして、findwindow 関数を使用してハンドルを見つけることができます。ここでわかるように、cmd のクラス名は ConsoleWindowClass です。但是部分笔记本的win11上的cmd并不是这个类名,所有需要注意!!!!
- ウィンドウが開くのが遅すぎる
ので、スリープ時間(単位は秒)を変更してウィンドウが開くまでの時間を確保してください。