可链接的python shell脚本,可以多次使用

可链接的python shell脚本,可以多次使用,python,bash,shell,unix,Python,Bash,Shell,Unix,我想创建一个pythonshell脚本myscript.py,它可以多次向管道提供输出或接收管道的输入。例如 $myscript.py | myscript.py | myscript.py。。。 以下实施仅在有限范围内有效: $ myscript.py NO INPUT (ok) $ echo 'hello' | myscript.py GOT INPUT >>> hello (ok) $ myscript.py | myscript.py NO INPUT (no

我想创建一个pythonshell脚本
myscript.py
,它可以多次向管道提供输出或接收管道的输入。例如

$myscript.py | myscript.py | myscript.py。。。

以下实施仅在有限范围内有效:

$ myscript.py
NO INPUT
(ok)

$ echo 'hello' | myscript.py
GOT INPUT >>> hello
(ok)


$ myscript.py | myscript.py
NO INPUT

(not ok, should be)
NO INPUT
GOT INPUT >>> NO INPUT
以下是myscript.py的内容:

#!/usr/bin/env python

if __name__=="__main__":
    import sys,os
    if (os.fstat(sys.stdin.fileno()).st_size > 0):
        stdincontents=sys.stdin.read()
        print "GOT INPUT >>> " + stdincontents
    else:
        print "NO INPUT"

您试图在stdin上查找文件的大小,但stdin不是文件,因此失败

相反,只要看看你是否得到了什么:

#!/usr/bin/env python
from __future__ import print_function

if __name__=="__main__":
    import sys,os
    if (os.isatty(0)):
        print("This program reads from stdin, which is currently a terminal.\n" +
              "Please type some text and finish with Ctrl+D.\n" +
              "(This informative text is not passed on.)", file=sys.stderr);

    stdincontents=sys.stdin.read()
    if(len(stdincontents) > 0):
        print("GOT INPUT >>> " + stdincontents)
    else:
        print("NO INPUT")
此程序使用标准UNIX语义,而不是执行您希望它执行的操作:

  • 您说希望第二个示例打印
    无输出
    ,然后
    获取输入>>无输出
    。这是不正常的:
    echo foo | nl | rev
    将不会打印
    1 foo
    ,后跟
    oof 1

    如果要查看管道中任意点的输出以及最终输出,请使用

    echo foo|nl|tee/dev/stderr|rev

  • 当由用户直接运行时,程序应该从stdin读取,而不是放弃并在没有输入的情况下运行

    此程序将打印一条有关如何执行此操作的信息消息。如果您强烈地感觉到Unix是错误的,您可以将其改为不读取输入

  • 下面是它的工作原理:

    $ echo hello | ./myscript.py
    GOT INPUT >>> hello
    
    $ echo hello | ./myscript.py | ./myscript.py
    GOT INPUT >>> GOT INPUT >>> hello
    
    $ ./myscript.py | ./myscript.py 
    This program reads from stdin, which is currently a terminal.
    Please type some text and finish with Ctrl+D
    (This informative text is not passed on.)
    ***pressed ctrl+d here***
    GOT INPUT >>> NO INPUT
    

    我认为存在一个基本问题:脚本要么阻塞等待输入,要么因为没有输入而终止。按照您所描述的方式,您希望链中的第一个进程写入“无输入”并终止—但您希望链中稍后的其他进程阻塞并等待。但是,由于它们都是相同的程序,它们具有相同的行为,因此链中稍后的一些进程也会死掉,表示没有输入并终止,从而关闭管道。所以我不明白它是怎么工作的。没有阻塞。我只需要一种方法将我的新python软件系统分解为模块化元素,并且我想要模拟可管道的shell进程。保持架构简单。“那个人”的回答正是我所需要的。在他的示例中,他在没有输入时添加了一个提示,可能是为了说明检查是否有输入的测试。因为我不想要任何阻塞,所以我只需将其替换为
    if(os.isatty(0)):
    。我不知道我怎么会不小心给人留下想要阻挡的印象。