我正在循环运行此代码-在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)确保子进程按顺序进行的解决方案都可以。
谢谢!
答案 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'
>>>