【问题标题】:How to run commands synchronously in Python如何在 Python 中同步运行命令
【发布时间】:2021-10-02 18:52:23
【问题描述】:

我正在制作 DVD 翻录脚本,需要同步运行命令才能使我的脚本正常工作。我一直在尝试使用子流程但没有成功。此测试代码应运行至少 7 秒。

import subprocess
import time

start_time = time.time()

p1 = subprocess.Popen(['timeout', "2"], shell=False,
                     stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)

p2 = subprocess.Popen(['timeout', "5"], shell=False,
                     stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)

print(f"Finshed in {time.time() - start_time} Seconds")

【问题讨论】:

    标签: python python-3.x subprocess


    【解决方案1】:

    使用.run() [1]

    import subprocess
    import time
    
    start_time = time.time()
    p1 = subprocess.run(['sleep', "2"])
    p2 = subprocess.run(['sleep', "5"])
    print(f"Finshed in {time.time() - start_time} Seconds")
    

    [1]https://docs.python.org/3/library/subprocess.html#subprocess.run

    【讨论】:

      【解决方案2】:

      可以使用Popen.wait方法,等待子进程终止:

      import subprocess
      import time
      
      start_time = time.time()
      
      p1 = subprocess.Popen(['sleep', "2"], shell=False,
                           stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
      p1.wait()
      
      p2 = subprocess.Popen(['sleep', "5"], shell=False,
                           stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
      p2.wait()
      
      print(f"Finshed in {time.time() - start_time} Seconds")
      

      如果我运行这个:

      (py39) Juans-MacBook-Pro:~ juan$ python -B stackoverflow.py
      Finshed in 7.015462160110474 Seconds
      

      注意,subprocess 文档建议您使用 subprocess.run 辅助函数,它会自动阻塞直到子进程终止。它返回一个subprocess.CompletedProcess 对象。所以:

      import subprocess
      import time
      
      start_time = time.time()
      
      result1 = subprocess.Popen(['sleep', "2"], shell=False,
                           stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
      
      result2 = subprocess.run(['sleep', "5"], shell=False,
                           stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
      
      print(f"Finshed in {time.time() - start_time} Seconds")
      

      将是另一种方法。

      【讨论】:

      • 我在 HandbrakeCLI 上使用过它,效果很好!感谢您的快速回复。
      猜你喜欢
      • 1970-01-01
      • 2012-07-19
      • 2016-05-28
      • 2013-12-27
      • 2021-10-13
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多