Python 如何从打开的cmd.exe窗口获取输出(字符串)?
我的处境与问这个问题的人相同,同时他设法用“win32(某物)”而不是“subprocess”来回答这个问题: 我对这个答案感到部分满意,但我遇到了一个新问题:如何“捕获”每个命令行(或至少是最后使用的命令行)生成的输出(字符串) 为了让您更了解上下文,我使用了一个程序,该程序需要cmd.exe(imagemagick)中的命令行,我使用它来比较图像,并使用一个复杂的统计标准,获得一个介于0和1之间的浮点数 这个数字正是我想要捕捉的 这是我当前的代码:Python 如何从打开的cmd.exe窗口获取输出(字符串)?,python,windows,cmd,subprocess,Python,Windows,Cmd,Subprocess,我的处境与问这个问题的人相同,同时他设法用“win32(某物)”而不是“subprocess”来回答这个问题: 我对这个答案感到部分满意,但我遇到了一个新问题:如何“捕获”每个命令行(或至少是最后使用的命令行)生成的输出(字符串) 为了让您更了解上下文,我使用了一个程序,该程序需要cmd.exe(imagemagick)中的命令行,我使用它来比较图像,并使用一个复杂的统计标准,获得一个介于0和1之间的浮点数 这个数字正是我想要捕捉的 这是我当前的代码: import time 导入操作系统
import time
导入操作系统
从win32com导入客户端
从Win32 GUI导入GetWindowText、GetForeGroundIndow、SetForeGroundIndow、EnumWindows
从Win32 Process导入GetWindowThreadProcessId
类激活EVEV:
def set_cmd_to_foreground(self, hwnd, extra):
"""sets first command prompt to forgeround"""
if "cmd.exe" in GetWindowText(hwnd):
SetForegroundWindow(hwnd)
return
def get_pid(self):
"""gets process id of command prompt on foreground"""
window = GetForegroundWindow()
return GetWindowThreadProcessId(window)[1]
def activate_venv(self, shell, venv_location):
"""activates venv of the active command prompt"""
shell.AppActivate(self.get_pid())
#shell.SendKeys("cd \ {ENTER}")
#shell.SendKeys(r"cd %s {ENTER}" % venv_location)
#shell.SendKeys("activate {ENTER}")
def run_py_script(self,shell):
"""runs the py script"""
shell.SendKeys("cd ../..{ENTER}")
shell.SendKeys("python run.py {ENTER}")
def run_script(self,shell,command_line):
"""runs a general script"""
shell.SendKeys(command_line)
def open_cmd(self, shell):
""" opens cmd """
shell.run("cmd.exe")
time.sleep(1)
def comparar(p,q):
try:
return 'magick compare -metric ncc C:\GTSgiffer\INput\{}.png C:\GTSgiffer\INput\{}.png null: 2>&1'.format(p,q)
except:
print(f"Error en comparar({p},{q})")
pass
if __name__ == "__main__":
'''shell = client.Dispatch("WScript.Shell")
run_venv = ActivateVenv()
run_venv.open_cmd(shell)
EnumWindows(run_venv.set_cmd_to_foreground, None)
run_venv.activate_venv(shell, "flask3.5/venv/scripts")
run_venv.run_py_script(shell)'''
shell = client.Dispatch("WScript.Shell")
run_venv = ActivateVenv()
run_venv.open_cmd(shell)
EnumWindows(run_venv.set_cmd_to_foreground, None)
run_venv.activate_venv(shell, "flask3.5/venv/scripts")
run_venv.run_script(shell,r"cd C:\GTSgiffer\bin {ENTER}")
run_venv.run_script(shell,comparar(1,2)+" {ENTER}")
run_venv.run_script(shell,comparar(1,3)+" {ENTER}")
尝试使用Python 3.5中引入的run函数。
这是调用流程的推荐方法
您也可以使用以下选项,但不是必需的
result = run("cmd.exe /c magick compare -metric ncc 1.jpg 2.jpg null:", capture_output=True)
您不想使用
子流程
有什么原因吗?您好@FARS,欢迎来到Stack Overflow!请将您的代码/命令及其所需输出直接复制并粘贴到帖子中,而不是链接到动画gif。to Paul M:我想使用“subprocess”,但我不知道如何在不关闭窗口的情况下将命令行从Python脚本发送到打开的cmd.exe窗口。我使用win32(somthing),因为这是它对我唯一有效的解决方案。对Yatin来说:这是我脚本中的一段很长的代码,但主要思想与这个老问题相同:基本上,我想要的是,从一个已经打开的cmd.exe窗口发送一个命令,然后得到它的结果,但不关闭同一个cmd.exe窗口。重复向同一个cmd.exe窗口发送多个命令,因为我想获得许多数值结果来处理多个图像。您给我的答案我已经知道,但坏的是,一旦发送的命令行结束,它就会关闭cmd.exe窗口。好的,我可能读错了,你在原来的帖子中说你需要捕捉数字。不管怎么说,既然你发布了你的代码,请发表我的评论。我一定是错过了你的密码。现在更有意义了。@FARS只需使用result=run(“cmd.exe/k magick compare-metric ncc 1.jpg 2.jpg null:,capture\u output=True)
来保持它的打开状态即可。对Neko Musume说:我想保持cmd.exe的打开状态,因为我想稍后发送一个命令来删除文件:“del something.png”。我以前尝试过使用临时窗口(打开、执行命令,然后关闭),但从长远来看,这给了我一个错误,无法存储浮点数(我希望保留的输出)。
result = run("cmd.exe /c magick compare -metric ncc 1.jpg 2.jpg null:", capture_output=True)