2013-07-17 66 views
6

我想打電話sys.stdin.readlines()而不刪除標準輸入中的任何內容。我在Linux上使用Python2.7。python2.7偷看stdin

例如,我要的是:

x = sys.stdin.readlines() 
y = sys.stdin.readlines() 

然後x和y具有相同的字符串。這是可以接受的,如果我可以從標準輸入讀取,並把內容重新

背景:

我有一個模塊,要麼需要一個文件作爲輸入和 - 可選參數或「一些輸入管道輸送到模塊「和一個可選參數

mymodule.py myfile -option 
or 
echo "some input" | mymodule.py -option 

我有這個工作,它工作正常。我正在檢查sys.stdin.isatty()以確定是否有任何輸入輸入。如果存在,如果命令行中有多個參數(如果存在一個可選參數,但沒有指定文件,則該模塊將引發錯誤是標準輸入)

我有一個問題的原因是因爲我需要有單元測試通過命令行,但也在日食。在命令行中一切正常,但它看起來像Eclipse的PyUnit插件也使用sys.stdin

如果我打電話給sys.stdin.readlines(),那麼eclipse會放棄運行單元測試。此外,即使我沒有指定任何參數,eclipse也會將事物推入sys.stdin,這使得很難確定是否存在有效的參數。

在我看來,以某種方式得到sys.stdin.readlines()而不改變內容將是一個解決方案,但我不知道如何做到這一點。任何解決這個問題的答案都會令人滿意。

可能的重複:Peek into stream of Popen pipeline in Python

謝謝!

編輯:沒有的東西,如任何運氣...

foo = sys.stdin.readlines() 
sys.stdin.write(foo) 

編輯:刪除恢復在拆解標準輸入,並把它在測試功能來代替,但沒有效果

回答

1

當你從一個管道讀取數據不在管道中了。您可以使用輪詢機制來查看是否有任何數據可以讀取,但不能在不移除內容的情況下查看內容,至少在Linux上不會。

如果提供了一個文件(即首先檢查文件參數),並且如果沒有提供文件作爲參數,則會忽略stdin,從而驗證stdin。

+0

that figures :(我希望它更像是一個文件,我可以.seek(0)... – liang

+0

我很快就放棄了這一點,我從運行stdin讀取一些運氣,然後設置sys.stdin = open('/ dev/tty','r +'),但這在Eclipse中不起作用。我不知道輸入來自哪裏,因爲最終客戶將在命令中使用模塊無論如何,我認爲最好的解決方案是你的建議 - 首先檢查一個文件,然後看看stdin – liang