在python中使用多个输出流?

时间:2018-02-11 18:29:59

标签: python linux io file-descriptor

我要做的是在python函数中创建多个输出流,并将它们称为123 .....: 在test.py

def main():
  ...
  print >>fd1, 'words1'
  print >>fd2, 'words2'
  print >>fd3, 'words3'
  ...

使用时重定向:

python test.py 1>1.txt 2>2.txt 3>3.txt

这些文件的内容:

1.txt ->  words1
2.txt ->  words2
3.txt ->  words3

问题是,如何创建fd1fd2fd3

添加了:

我用过这个:

outfiles = {}  
for _ in range(3): 
    fd = os.dup(1)
    outfiles[fd] = os.fdopen(fd, 'w')

def main():
  for no in outfiles: 
    print >>outfiles[no], "foo"
    print >>outfiles[no], outfiles[no].fileno()

但结果取决于我执行此代码的方式:

EG1:

python test.py

foo
3
foo
4
foo
5

EG2:

python test.py 3>log.txt


foo
4
foo
5
foo
6

EG3:

python test.py 1>log.txt

Nothing printed

所以我猜,输出实际上是1,如果文件描述符已经在执行中使用(例如:python test.py 3>log.txt),os.dup(1)将不会返回它了。

2 个答案:

答案 0 :(得分:4)

在Linux上,/proc/self/fd/中存在您想要存在的文件句柄。例如:

with open('/proc/self/fd/1', 'w') as fd1, open('/proc/self/fd/2', 'w') as fd2, open('/proc/self/fd/3', 'w') as fd3:
   print >>fd1, 'words1'
   print >>fd2, 'words2'
   print >>fd3, 'words3'

在其他一些unices上,您可能会在/dev/fd下找到类似的文件句柄。

现在,您可以运行命令并验证输出文件是否符合要求:

$ python test.py 1>1.txt 2>2.txt 3>3.txt
$ cat 1.txt
words1
$ cat 2.txt
words2
$ cat 3.txt
words3

打开文件描述符数量的限制

操作系统限制进程可能具有的最大打开文件描述符数。有关此问题的讨论,请参阅"Limits on the number of file descriptors"

使用bash编号的文件描述符时,限制要严格得多。在bash下,只为用户保留最多9个文件描述符。使用更高的数字可能会导致与bash的内部使用冲突。来自man bash

  

使用大于9的文件描述符的重定向应该与。一起使用   小心,因为它们可能与shell使用的文件描述符冲突   内部。

如果根据注释,您要分配数百个文件描述符,则不要在/proc/self/fd中使用shell重定向或编号描述符。相反,使用python的open命令,例如open('255.txt', 'w')直接在您想要的每个输出文件上。

答案 1 :(得分:4)

您需要模块foreach($a->find('p') as $key => $elm) { if ($key > 0) { echo '<p>'; } echo $elm->href .$elm->plaintext; } 。首先,复制标准输出(根据需要多次)并为其构建高级文件对象。通常,stdout的第一个副本是文件描述符#3。

os

现在,您可以使用新文件对象进行打印:

outfiles = {} # a future dictionary of output file objects
for _ in range(N): # How many streams do you want?
    new_stdout = os.dup(1)
    outfiles[new_stdout] = os.fdopen(new_stdout, mode='w')

重新定义文件描述符0,1和2是个坏主意。请不要。