如何等待Python subprocess.check_output()完成?

时间:2019-04-15 14:25:11

标签: python subprocess wait

我正在循环运行此代码-在Python 3.6中:

# previous code: copy certain files to the working folder
    shellCmd = "myCmd " + file1 + " " + file2

# myCmd works on file1 and file2  
    result = subprocess.check_output(myCmd, shell=True)

# delete the files

我有时会因拒绝访问某些文件而导致失败。我猜该子进程正在后台运行,并且循环继续进行,从而产生了其他子进程。有时,这将导致一个子进程尝试复制(或删除)myCmd在另一子进程中仍在忙的文件。

如何停止并等待subprocess.check_output()完成?

我看到subprocess.Popen有一个wait()函数,但是我需要myCmd进程的结果字符串,因此想使用subprocess.check_output()。

但是任何能够(a)使我获得myCmd的字符串输出和(b)确保子进程按顺序进行的解决方案都可以。

谢谢!

2 个答案:

答案 0 :(得分:1)

否,check_output仅在子进程完成运行后返回。您的问题是由其他原因引起的。

答案 1 :(得分:1)

您描述的情况远不能令人满意,因为如果我正确理解您的描述,似乎多个子流程有时会创建竞争条件。合理的做法是让您的程序从子进程的显示中读取输出。

如果您想更好地控制子流程,可以使用subprocess.Popen对象,它们具有更可用的接口,因此更加安全。通过读取一个命令的输出直到到达文件结尾,您知道您将不会创建其他进程来进行干预。将命令的标准输出发送到带有stdout=subprocess.PIPE的管道,然后您可以读取流程的标准输出作为Popen对象的stdout属性,如下所示。

>>> process = subprocess.Popen("getmac", stdout=subprocess.PIPE)
>>> for line in process.stdout:
...     print(line)
...
b'\r\n'
b'Physical Address    Transport Name                                            \r\n'
b'=================== ==========================================================\r\n'
b'94-C6-91-1B-56-A4   \\Device\\Tcpip_{023B9717-B878-43D4-A0BE-28A4295785FA}      \r\n'
b'68-EC-C5-52-14-AD   Media disconnected                                        \r\n'
b'68-EC-C5-52-14-B1   Media disconnected                                        \r\n'
b'0A-00-27-00-00-0E   \\Device\\Tcpip_{89DD54F9-0C99-4F5B-8376-45598FB4C0FD}      \r\n'
>>>