Python 创建并管道化类似文件的对象作为命令的输入

Python 创建并管道化类似文件的对象作为命令的输入,python,linux,file,subprocess,Python,Linux,File,Subprocess,如果可能的话,我正在寻找更好的方法: import subprocess f = open('temp.file', 'w+') f.write('hello world') f.close() out = subprocess.check_output(['cat', 'temp.file']) print out subprocess.check_output(['rm', 'temp.file']) 在本例中,我创建了一个文件,并将其作为输入传递给cat(实际上,我运行的不是ca

如果可能的话,我正在寻找更好的方法:

import subprocess

f = open('temp.file', 'w+')
f.write('hello world')
f.close()

out = subprocess.check_output(['cat', 'temp.file'])

print out

subprocess.check_output(['rm', 'temp.file'])
在本例中,我创建了一个文件,并将其作为输入传递给
cat
(实际上,我运行的不是
cat
,而是解析输入
pcap
文件的其他程序)


我想知道的是,在Python中有没有一种方法可以创建一个包含一些内容的“类似文件的对象”,并将这个类似文件的对象作为命令行程序的输入。如果可能的话,我认为这比将文件写入磁盘然后删除该文件更有效。

如果程序配置为从
stdin
读取,您可以使用:


check\u output
使用
stdin
input参数指定要连接到进程标准输入的类似文件的对象

with open('temp.file') as input:
    out = subprocess.check_output(['cat'], stdin=input)
而且,不需要花钱去运行
rm
;您可以直接从Python中删除该文件:

os.remove('temp.file')

您可以写入临时文件

import subprocess
from tempfile import TemporaryFile
f = TemporaryFile("w")
f.write("foo")
f.seek(0)
out = subprocess.check_output(['cat'],stdin=f)

print(out)
b'foo'
如果只想写入类似文件的对象并获取内容:

from io import StringIO
f = StringIO()
f.write("foo")

print(f.getvalue())

如果该命令只接受文件名,如果它不从其stdin读取输入,即如果您不能使用,或者您可以尝试
/dev/fd/#
文件名:

#!/usr/bin/env python3
import os
import subprocess
import threading

def pump_input(pipe):
    with pipe:
        for i in range(3):
            print(i, file=pipe)

r, w = os.pipe()
try:
    threading.Thread(target=pump_input, args=[open(w, 'w')]).start()
    out = subprocess.check_output(['cat', '/dev/fd/'+str(r)], pass_fds=[r])
finally:
    os.close(r)
print('got:', out)
没有内容接触到磁盘。输入通过管道直接传递到子流程

如果有一个类似文件的对象不是真正的文件(否则,只需将其名称作为命令行参数传递),则
pump\u input()
的外观可能如下所示:

import shutil

def pump_input(pipe):
    with pipe:
        shutil.copyfileobj(file_like_object, pipe)

这实际上是您的程序的瓶颈,还是您只是假设它可能在某个时候出现?如果收件人程序未配置为从STDIN读取,则您别无选择,只能写入磁盘;否则,您可以通过简单的重定向来流式传输数据-假设我理解您的意图。@BurhanKhalid:有一些方法允许您将输入作为文件名传递,而无需将相应的内容写入磁盘。只有当
.fileno()
返回有效的文件描述符时,您才能传递类似文件的对象,例如。,无法传递
StringIO
对象。
import shutil

def pump_input(pipe):
    with pipe:
        shutil.copyfileobj(file_like_object, pipe)