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

1 投票
2 回答
5043 浏览
提问于 2025-04-18 00:26

我想从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 个回答

1

你在调用的时候使用了 shell 重定向字符,但当你使用 subprocess 并且设置 shell=False 时,你需要手动处理这些管道。看起来你是把这些重定向字符直接作为参数传给了 a.out 程序。试试在你的命令行中运行这个:

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

看看 a.out 是否也会在那时结束。

2

这里有两个问题(至少):

  1. <> 这些重定向操作是由一个叫做“shell”的东西来处理的。而 subprocess 默认情况下并不会启动这个“shell”(你也不应该这样做)。
  2. 如果你设置了 stdout=PIPEstderr=PIPE,那么你必须从这些管道中读取数据,否则这个进程可能会一直卡住。

如果想让一个子进程从文件中读取数据并写入到文件中,可以这样做:

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 这个设置会把标准输出和标准错误合并在一起。

撰写回答