【问题标题】:Run multiple commands in single cmd with some delay在单个 cmd 中运行多个命令,但有一些延迟
【发布时间】:2021-04-09 08:00:53
【问题描述】:

我想在单个 cmd 中运行多个命令,并且我希望在命令之间有一个延迟。

我有以下代码

import os

os.system('cmd /k "command1" & "command2" & "command3"')

如何在这些命令之间添加一些 time.sleep?

【问题讨论】:

  • 你试过timeout <seconds>还是pause
  • 你不能在它们之间添加一个windows sleep命令吗?你将无法在 Python 中执行此操作,因为 os.system 命令在完成之前不会将控制权交还给 python
  • 解释一下命令是什么会有所帮助,因为一般来说,一个命令在前一个命令完成之前不会运行。睡眠/延迟的目的是什么?你为什么用os.system()而不是subprocess.[call|popen|run]()

标签: python cmd


【解决方案1】:

在许多方法中,这可能是最简单的一种:

import os

os.system('cmd /K "command1 & timeout 30 & command2 & timeout 30 & command3"')

这使用了CMD 环境中存在的timeout 函数,并允许其他命令正确运行。

注意:CMD 选项 /K 将在系统上留下垃圾外壳会话,而不是您应该使用 /C 因为它会导致 CMD 实例在所有命令完成或错误时终止遇到了。

即:

import os

os.system('cmd /C "command1 & timeout 30 & command2 & timeout 30 & command3"')

当然,您可能希望以秒为单位控制每次超时的时间:

例如:

import os
WaitSeconds1=30
WaitSeconds2=90

os.system('cmd /C "command1 & timeout '+WaitSeconds1+' & command2 & timeout '+WaitSeconds2+' & command3"')

说了这么多,我想确保你明白CMD不会并行执行这些命令,所以如果超时是为了避免并行处理,而不是等待额外的东西注册等。

我知道并不是每个命令都在退出之前等待它的工作完成(我正在看着你,其中包括 DiskPart![虽然,TBQF,Diskpart 有正当的理由设置它的方式,它只是需要改进以获得更好的脚本反馈。))。

但是,如果您知道情况并非如此,则可以使用:

import os

os.system('cmd /C "command1 & command2 & command3"')

而且,正如@Arty 所提到的,您始终可以在任何这些示例中将单个 & 符号 & 替换为双 & 符号 &&,以便仅在前一个命令成功完成时才执行下一个命令,如果那是一个必要的条件。 :)

【讨论】:

    【解决方案2】:

    如果您使用精确的time.sleep() 并不重要,如果您只是想以某种方式睡觉那么您可以使用内置命令sleep <seconds>(或timeout <seconds> 而不是sleep),就像下面的代码:

    import os
    sleep_seconds = 2
    os.system(f'cmd /k "echo abc && sleep {sleep_seconds} && echo def && sleep {sleep_seconds} && echo ghi"')
    

    您也可能想要/c 而不是/k,因为/k 执行命令字符串并让cmd 控制台运行,而/c 关闭控制台。


    您也可以使用subprocess.run() + time.sleep(),如下所示:

    import subprocess, time
    sleep_seconds = 2
    subprocess.run(['echo', 'abc'], check = True)
    time.sleep(sleep_seconds)
    subprocess.run(['echo', 'def'], check = True)
    time.sleep(sleep_seconds)
    subprocess.run(['echo', 'ghi'], check = True)
    

    注意!在上面的第一个示例中,如果您的任务需要,您可能希望使用& 而不是&&。同样在第二个示例中,如果要建模 & 行为,请设置 check = False,如果要建模 && 行为,请设置 check = True

    【讨论】:

      【解决方案3】:

      您可以尝试使用 Python 提供的 time 模块。

      在运行os命令的python命令之间,可以使用:

      import time
      time.sleep(n)
      

      其中 n 是您希望延迟发生的秒数。

      【讨论】:

        猜你喜欢
        • 2013-06-08
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        相关资源
        最近更新 更多