我无法修改的程序将其输出写入作为参数提供的文件。我想让输出到RAM,所以我不必做不必要的磁盘IO。 我以为我可以使用tmpfs并“欺骗”程序来写入,但是并非所有的Linux发行版都使用/ tmp的tmpfs,某些在/ dev / shm(RedHat)下的/ run(Ubuntu)下运行tmpfs。 我希望我的程序尽可能便携,如果可以避免的话,我不想在用户的系统上创建tmpfs文件系统。 显然我可以做df | grep tmpfs并使用返回的任何挂载,但我希望更优雅的东西。 是否有可能写入伪终端或者可能在某处/某处?
答案 0 :(得分:4)
将/proc/self/fd/1
作为文件名传递给子程序。对/proc/self/fd/1
的所有写入实际上都将转到子程序的标准输出。使用subprocess.Popen()
等来捕获孩子的标准输出。
答案 1 :(得分:1)
您可以将Python脚本拆分为两部分,一部分重复调用另一部分程序,另一部分合并结果,并将前者转换为Bash脚本,以便您可以使用>()
进程替换构造将一个伪文件传递给另一个实际上是另一个进程的标准输入的程序。
的PoC:
假设这是另一个程序:
$ cat otherprogram.py
#/usr/bin/env python
import sys
with open(sys.argv[1], 'w') as file:
file.write('Hello\n')
它在参数中使用文件名并向其写入“Hello”。假设你需要调用它五次。然后你可以做这样的事情:
for i in {1..5}; do python otherprogram.py >(cat) ; done
将输出到stdout otherprogram.py
认为它写入文件的内容。然后,您可以使用Python脚本的其他部分来使用它,如下所示:
$ cat consume.py
#!/bin/env python
import fileinput
for line in fileinput.input():
print "Processing line ", line
(这只是对'你好'的预设)
$ { for i in {1..5}; do python otherprogram.py >(cat) ; done } | python consume.py
Processing line Hello
Processing line Hello
Processing line Hello
Processing line Hello
Processing line Hello
那么otherprogram.py
认为它正在写入文件,它实际上是通过Bash的进程替换机制发送到程序的stdin而没有访问磁盘。
答案 2 :(得分:1)
如果子进程接受不可搜索的文件,您可以try named pipes。命名管道的内容不会触及磁盘。