Python 如何从打开的cmd.exe窗口获取输出(字符串)?

Python 如何从打开的cmd.exe窗口获取输出(字符串)?,python,windows,cmd,subprocess,Python,Windows,Cmd,Subprocess,我的处境与问这个问题的人相同,同时他设法用“win32(某物)”而不是“subprocess”来回答这个问题: 我对这个答案感到部分满意,但我遇到了一个新问题:如何“捕获”每个命令行(或至少是最后使用的命令行)生成的输出(字符串) 为了让您更了解上下文,我使用了一个程序,该程序需要cmd.exe(imagemagick)中的命令行,我使用它来比较图像,并使用一个复杂的统计标准,获得一个介于0和1之间的浮点数 这个数字正是我想要捕捉的 这是我当前的代码: import time 导入操作系统

我的处境与问这个问题的人相同,同时他设法用“win32(某物)”而不是“subprocess”来回答这个问题:

我对这个答案感到部分满意,但我遇到了一个新问题:如何“捕获”每个命令行(或至少是最后使用的命令行)生成的输出(字符串)

为了让您更了解上下文,我使用了一个程序,该程序需要cmd.exe(imagemagick)中的命令行,我使用它来比较图像,并使用一个复杂的统计标准,获得一个介于0和1之间的浮点数

这个数字正是我想要捕捉的

这是我当前的代码:

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)