我正在编写一个命令行工具(让我们称之为interactive_rm
),它应该从STDIN逐行读取文件路径,以便它可以与Unix管道一起使用如下例所示:
$ find . | interactive_rm
我目前正在阅读STDIN的每条路径:
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”
有没有人知道这方面的解决方案?
答案 0 :(得分:2)
重定向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
。