使用subprocess.Popen()或subprocess.check_call()时程序卡住

时间:2014-03-29 14:13:53

标签: python python-2.7 subprocess popen

我想从python运行一个程序并找到它的内存使用情况。为此我正在使用:

l=['./a.out','<','in.txt','>','out.txt']
p=subprocess.Popen(l,shell=False,stdout = subprocess.PIPE, stderr = subprocess.PIPE)
p.wait()
Res= getrusage(resource.RUSAGE_CHILDREN)
print Res.ru_maxrss

我也尝试使用check_call(l,shell=False,stdout = subprocess.PIPE, stderr = subprocess.PIPE)并删除p.wait,但问题是程序在使用Popen时遇到了p.wait(),而在使用check_call()时遇到check_call()。我无法弄清楚为什么会这样。我的论点列表是错误的。

命令./a.out < in.txt > out.txt在终端上正常工作。我正在使用Ubuntu

2 个答案:

答案 0 :(得分:2)

有两个问题(至少):

  1. <>重定向由shell处理。 subprocess默认情况下不生成shell(你也不应该)
  2. 如果stdout=PIPEstderr=PIPE那么您必须从管道中读取,否则流程可能会永久阻止
  3. 从文件中读取子进程并写入文件:

    from subprocess import check_call, STDOUT
    
    with open('in.txt') as file, open('out.txt', 'w') as outfile:
        check_call(["./a.out"], stdin=file, stdout=outfile, stderr=STDOUT)
    

    stderr=STDOUT合并stdout,stderr。

答案 1 :(得分:1)

您在通话中使用了shell重定向字符,但是当您使用subprocess并设置shell=False时,您必须手动处理这些管道。 您似乎直接将这些重定向字符作为参数传递给a.out程序。 尝试在shell中运行它:

./a.out '<' in.txt '>' out.txt

查看a.out是否也会终止。