【问题标题】:Program getting stuck when using subprocess.Popen() or subprocess.check_call()使用 subprocess.Popen() 或 subprocess.check_call() 时程序卡住
【发布时间】:2014-05-09 01:22:16
【问题描述】:

我想从 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 &lt; in.txt &gt; out.txt 命令在终端上运行良好。我正在使用 Ubuntu

【问题讨论】:

    标签: python python-2.7 subprocess popen


    【解决方案1】:

    有两个问题(至少):

    1. &lt;&gt; 重定向由 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 合并标准输出、标准错误。

    【讨论】:

    • 好的,我知道了...我知道我的下一个问题是题外话,但我用来计算正在执行的程序的内存使用情况的方案没有返回正确的答案。我想知道如何获得最大内存使用量。
    • 我尝试使用 psutil 但我有一个疑问。如果这个过程在到达psutil.Process(p.pid) 之前就结束了,那么会发生什么。有时会出现输出 (rss=0,vms=0) 这是什么意思?但在随后的运行中,它显示几乎正确的内存使用情况。
    • 初始运行的输出仍然是相同的问题 (rss=0,vms=0) 但随后在一些运行后我得到了正确的输出
    • 我不知道,为什么psutil 返回0(可能在文档中提到)。这是code example that reports maximum memory for a current process。你可能会问为什么psutil 会以a new question 的形式返回0,0 作为内存(如果你已经知道post your own answer)。
    【解决方案2】:

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

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

    看看a.out是否也终止了。

    【讨论】:

    • ./a.out&lt;in.txt&gt;out.txt 在终端上工作正常
    • @user2179293,我在原始问题中没有看到这一点,感谢您引起我的注意。我现在已经编辑了答案,请看一下。
    • 好的,我明白了,输入没有被重定向。如何重定向我的输入?我不想使用shell=True,因为在计算内存使用量时,程序计算的是shell的内存使用量,而不是shell=True的程序。
    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2018-03-20
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多