为简化起见,假设 shell 脚本是cat
命令。在 shell 中,它通常会这样调用:
$ cat /some/path/myfile.txt
现在该文件将被动态创建并将其写入磁盘将是一个主要的性能损失,存在安全问题并增加多用户环境中的文件管理开销。该脚本无法修改,也无法从标准输入读取(cat
只是一个工作示例)。
我试过这个:
import os
pin, pout = os.pipe()
pin, pout = os.fdopen(pin, 'r'), os.fdopen(pout,'w')
from subprocess import Popen
pout.write("test")
pout.flush()
p = Popen('cat /proc/self/fd/%s' % pout.fileno(), shell=True)
即使我关闭pout
p.poll()
仍然没有返回任何内容,表明该命令仍在等待来自管道的更多输入。
我怎样才能告诉命令没有更多的数据来自管道?有没有其他方法可以解决这个问题?
编辑
在 bash 中,如果文件内容是由名为prog1
this 的程序生成的,将通过以下方式解决:
$ cat <(prog1)
编辑 2
如果您不需要外壳,那么 Alfe 提到的另一个选项会更好,尽管问题仍然存在(即读取文件内容后进程未完成)
#...same as before
p = Popen(['cat', '/dev/stdin'], stdin=pout)