在python中使用多个输出流?
作者:互联网
我要做的是在python函数中创建多个输出流,并将它们称为1,2,3 ……:
在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
问题是,如何创建那些fd1,fd2,fd3?
添加:
我用过这个:
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()
但结果取决于我如何执行此代码:
点拨:
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)将不再返回它.
解决方法:
在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:
Redirections using file descriptors greater than 9 should be used with
care, as they may conflict with file descriptors the shell uses
internally.
如果根据注释,您要分配数百个文件描述符,则不要在/ proc / self / fd中使用shell重定向或编号描述符.相反,使用python的open命令,例如直接在您想要的每个输出文件上打开(‘255.txt’,’w’).
标签:python,linux,io,file-descriptor 来源: https://codeday.me/bug/20190724/1521924.html