Python:使用子进程来连续ls

问题描述 投票:0回答:1

我有一个脚本,可以将一堆新文件写入目录。写入每个文件后,我要打印ls命令的结果。问题是,如果我打电话

import subprocess

p = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
print ''.join(p.stdout.readlines())

然后最终(在写入许多文件之后,由该行引发了“ OSError:[Errno 12]无法分配内存”

p = subprocess.Popen(['ls'], stdout=subprocess.PIPE)

因为子进程在内部调用os.fork(),这使当前使用的内存增加了一倍。

正如另一个堆栈溢出(https://stackoverflow.com/a/13329386所建议的那样,我们应该能够通过在脚本开始时初始化单个Popen对象,然后根据需要生成子进程)来解决此问题。但是,当我做

p = subprocess.Popen(['ls'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
while True:
    p.stdin.write('ls')
    print p.stdout.readlines()

在第一个p.stdin.write('ls')处抛出“ IOError:[Errno 32]损坏的管道”,因为进程已经完成执行并且输入管道已关闭。

关于如何实现这一目标的任何想法?

python subprocess
1个回答
0
投票

我建议您尝试subprocess.run,这是您可能想尝试的代码,

import subprocess
import time

def check_files():
    result = subprocess.run(["ls"], capture_output=True)
    print(result.stdout.decode('utf-8'))


while True:
    check_files()
    time.sleep(1)
© www.soinside.com 2019 - 2024. All rights reserved.