我有一个脚本,可以将一堆新文件写入目录。写入每个文件后,我要打印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]损坏的管道”,因为进程已经完成执行并且输入管道已关闭。
关于如何实现这一目标的任何想法?
我建议您尝试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)