2017-09-27 114 views
1

我正在寫一個命令行工具(我們稱之爲interactive_rm),是應該從標準輸入線讀取文件路徑線,使得它可以與UNIX管道在下面的示例中使用,如:從管道讀取STDIN時獲取用戶輸入?

$ find . | interactive_rm 

我目前正在讀從標準輸入每個路徑是這樣的:該工具刪除路徑

def _parse_stdin(): 
    for line in sys.stdin: 
     yield prepare_line(line) 

現在的問題......之前,應該要求用戶進行確認。要做到這一點,我會用input()這樣的:

for path in _parse_stdin(): 
    print('Do you want to delete this path: [y/n]\n' + path) 
    answer = input() 
    if answer == 'y': 
     delete(path) 

但是,這並不工作,因爲STDIN已經被管道佔據,所以input()功能被跳過,或者我結束了一個「的EOFError:EOF當讀一行「

有沒有人知道這個解決方案?

回答

1

stdin被重定向,它需要重新打開終端,以便能夠從中讀取數據,如:

from __future__ import print_function 

import os 

def main(): 
    tty = os.open("/dev/tty", os.O_RDONLY) 
    while True: 
     r = os.read(tty, 1024) 
     if not r: # Wait for Ctrl-D. 
      break 
     print("----", r) 

if __name__ == "__main__": 
    main() 

而像下面來測試它運行它:

python t.py < /dev/null 

注該終端可能不可用。例如,如果通過ssh會話運行該命令而不分配終端爲ssh -T ... command