【问题标题】:Python: Start new command prompt on Windows and wait for it finish/exitPython:在 Windows 上启动新的命令提示符并等待它完成/退出
【发布时间】:2012-07-21 20:40:28
【问题描述】:

我不明白为什么在 Windows 上执行此操作如此困难。

我想生成一堆可以运行其他脚本的命令提示符窗口。我想要这个的原因是我可以整齐地看到每个脚本的所有输出(如果我让它们只是主窗口中的线程/子进程,我无法正确查看所有输出)。我也不想记录输出,因为它主要用于查看进度条,这实际上不适用于日志文件。

所以我的要求的各个部分有效,但不能一起工作:

os.system("start cmd /c {command here}")     # Launches in new command prompt, closes when done

但是,os 系统不会让我等到命令完成(因为 start 是实际命令,第二个它打开新命令提示符它是“完成”)

同样,如果我尝试:

p = subprocess.Popen(["start", "cmd", "/k", "{command here}"], shell = True) # Needs to be shell since start isn't an executable, its a shell cmd
p.wait()    # I can wait until finished (although it too finishes after start finishes)

那么我该怎么做呢?我在某处读到一个解决方案可能是使用 processgroup 但它只是 unix ......或类似的东西

或者,如果您有一种巧妙的方式在单个窗口中显示所有子进程的输出,那么我不需要打开新的命令提示符并且可以简单地使用线程。这也有效,但如果我说 4 个线程正在下载某些东西并显示进度条以及输出其他信息,我不知道如何以一种可以阅读的方式显示它(以及避免它们都与彼此)。

PS:这是在 Windows Vista 上。 PPS:我希望有一个适用于 Windows、Linux 和 Mac 的解决方案,我现在专注于 Windows,但我想要一个适用于所有三者的解决方案,而且我知道 Windows 是最挑剔的。我只想用“the start cmd /c”代替操作系统的相应命令。

【问题讨论】:

  • 我找到的唯一方法是打开一个新的命令提示符,如果有其他方法可以的话

标签: python windows


【解决方案1】:

阅读您对我之前回答的评论后,您需要的是:

os.system("start /wait cmd /c {command}")

the windows command reference 随时待命!

【讨论】:

  • /c 只是关闭 cmd,甚至不等待命令完成执行。有没有办法让它等到命令完全执行然后自动关闭命令提示符?或者是否有任何其他方式可以在新的 cmd 窗口上运行多个命令?
  • 没有。来自答案中链接的 Windows 命令参考:/c Carries out the command specified by String and then stops.
【解决方案2】:

接受的答案对我不起作用。
要在新的命令提示符下打开,我必须使用:

os.system("start /B start cmd.exe @cmd /k mycommand...")

【讨论】:

  • 这不是真的。 /B 确保你没有打开命令提示符
  • @yes4me,你可能是对的,但奇怪的是,这段代码在 Windows 上启动了一个新的命令提示符并等待它完成/退出,去看看......
【解决方案3】:

对我来说这似乎可行
os.system("cmd /k {command}")

使用/k cmd 执行然后保持打开状态
使用 /c 执行并关闭

打开一个新的命令窗口然后执行命令
os.system("start cmd /k {command}")

【讨论】:

    【解决方案4】:

    您可以将 /WAIT 传递给 start 命令以使其等待终止。

    【讨论】:

      【解决方案5】:

      怎么样

      os.system("cmd /c {command here}") 
      

      甚至

      os.system("{command here}")
      

      启动命令是启动一个单独的会话,而不是使用运行 python 程序的那个命令。

      【讨论】:

      • 这不会启动一个新的命令提示符窗口,它会在当前窗口中运行它
      【解决方案6】:

      打开新 cmd 窗口的最简单方法(如 https://stackoverflow.com/a/11615580/3312367 指出的那样)是使用

      os.system("start /wait cmd /c {command}")
      

      但如果您的命令是一个包含空格或其他控制字符的复杂命令,则它不是很有用。为此我使用:

      subprocess.run(["start", "/wait", "cmd", "/K", command, "arg /?\^"], shell=True)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        相关资源
        最近更新 更多