2014-12-04 48 views
2

我想创建一个python shell脚本myscript.py,它可以将输出提供给管道或接收管道的输入,不止一次。例如。可连接的python shell脚本,可以多次使用

$ 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" 
+0

我觉得这是一个根本性的问题:剧本要么必须_block_等待输入,或终止因为没有输入。您描述它的方式,您希望链中的第一个进程写入“NO INPUT”并终止 - 但您希望链中的其他进程阻塞并等待。但由于它们都是相同的程序,它们具有相同的行为,所以稍后链中的一些过程也会死于不输入和终止,关闭管道。所以我不明白它是如何工作的。 – wim 2014-12-04 01:31:31

+0

没有阻塞。我只是需要一种方法来将我的新python软件系统分解为模块化元素,并且我想模仿管道化的shell过程。保持架构简单。 @thatotherguy的回答正是我所需要的。在他的例子中,当没有输入时他会添加提示,可能是为了说明测试是否有输入。由于我不想任何阻塞,我会简单地用'if(os.isatty(0)):<替代输入,像命令行参数等'替换它。我不知道我是如何意外地给我留下了印象。 – 2014-12-04 02:44:04

回答

5

你试图找到大小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语义:

  1. 你说你要你的第二个例子打印NO OUTPUT,然后GOT INPUT >>> NO OUTPUT。这是不正常的:echo foo | nl | rev将不打印1 foo其次oof 1

    如果你想看看输出的管道以及最终输出的任意一点,使用

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

  2. 当用户直接运行,程序,预计从标准输入读取,不要放弃,没有输入就跑步。

    该程序打印关于如何做到这一点的信息性消息。如果您强烈地感觉到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 
+0

这很完美,谢谢。 – 2014-12-04 01:49:22

相关问题