2014-12-04 47 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

相關問題