2

我无法修改的程序将其输出写入作为参数提供的文件。我想让输出进入 RAM,这样我就不必做不必要的磁盘 IO。我以为我可以使用 tmpfs 并“欺骗”程序来写入它,但是并非所有 Linux 发行版都将 tmpfs 用于 /tmp,一些在 /run(Ubuntu)下安装 tmpfs,其他在 /dev/shm(RedHat)下。我希望我的程序尽可能可移植,如果可以避免的话,我不想在用户系统上创建 tmpfs 文件系统。显然我可以做 df | grep tmpfs 并使用返回的任何安装,但我希望有一些更优雅的东西。是否可以写入伪终端或 /proc 某处?

4

3 回答 3

4

/proc/self/fd/1作为文件名传递给子程序。所有的写入/proc/self/fd/1实际上都会进入子程序的标准输出。使用subprocess.Popen()等来捕获孩子的标准输出。

于 2014-09-03T22:43:46.137 回答
2

如果子进程接受不可搜索的文件,您可以尝试命名管道。命名管道的内容不接触磁盘。

于 2014-09-03T23:38:02.023 回答
1

你可以将你的 Python 脚本分成两部分,一个重复调用另一个程序,一个合并结果,然后将前者转换为 Bash 脚本,这样你就可以使用>()进程替换构造将伪文件传递给另一个程序这实际上是另一个进程的标准输入。

概念验证:

假设这是另一个程序:

$ 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

这将输出到 stdoutotherprogram.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 的进程替换机制,它认为它正在写入文件,实际上它正在发送到您的程序的标准输入而不会碰到磁盘。

于 2014-09-03T22:24:17.427 回答