python 将标准输入链接到标准输出的问题

问题描述 投票:0回答:1

我想要几个Python脚本来修改文本文件。例如,“do1”接受来自 stdin 或文件的输入,并将输出发送到 stdout 或文件:

#!/usr/bin/env python3

import sys
import select

fi = sys.stdin if select.select([ sys.stdin, ], [], [], 0.0 )[ 0 ] else None

ofname = None
for arg in sys.argv[ 1 : ]:
    if       fi is None: fi = open( arg )
    elif ofname is None: ofname = arg

if fi is None:
    print( '1 no stdin or input file' ) # 2 for do2
    exit( 1 )

if ofname is None:
    fo = sys.stdout
else:
    fo = open( ofname, 'w' )

for l in fi:
    fo.write( '1' ) # 2 for do2
    fo.write( l )

第二个脚本 do2 是相同的,但如注释中所示为“2 for 1”。当运行这个(在 unix 上)时,我得到了各种结果:

$ echo hi | ./do1 | ./do2
2 no stdin or input file
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe

$ echo hi | ./do1 | ./do2
2 no stdin or input file

$ echo hi | ./do1 | ./do2
21hi

这是怎么回事?我认为这是某种计时问题,前一个管道在下一个程序可以读取它之前就消失了,但我不知道如何进展。

python pipe
1个回答
0
投票

我不确定它们是否是真正的原因,但我怀疑有两个潜在的麻烦来源

  • 您正在
    open
    编辑您的文件,但永远不要
    close
    它们,在
    python
    中,您应该使用
    with open
    ...(它将自动为您关闭文件)或
    close
    自己归档
  • 缓冲虽然未在
    open
    中设置,但假设“交互式”文本文件(isatty()返回True的文件)使用行缓冲。其中行缓冲意味着
    python
    会推迟写入,直到找到行结尾,您如果你想更早地进行写入,则需要刷新
© www.soinside.com 2019 - 2024. All rights reserved.