Python CLI脚本中的管道和提示

2024-05-16 06:09:20 发布

您现在位置:Python中文网/ 问答频道 /正文

可以在pythoncli脚本中组合管道输入和TTY提示吗?E、 g.,运行这个:

import sys

piped_text = None

if not sys.stdin.isatty():
    piped_text = sys.stdin.read()

user_in = raw_input('Enter something: ')

if piped_text:
    sys.stdout.write(piped_text)

sys.stdout.write(user_in + '\n')  

生成以下输出:

^{pr2}$

当我要寻找的输出是:

~: python mrprompt.py
Enter something: something
something
~: echo foo | python mrprompt.py
Enter something: something
foo
something

我想,用不同的措辞,子shell有可能知道其父shell的tty吗?在Python中,是否可以交互父shell的tty?我在GNU屏幕内部使用bash(因此,读取'SSH TTY'环境变量不是一个可行的选择)。在


Tags: textinpyifstdinstdoutsysshell
3条回答

可以在同一程序中同时接受管道输入和用户输入。在

最简单的处理方法是使用subprocess模块。您将从Python程序中执行该程序。它的参数允许您设置与正在执行的程序之间的管道。在

很简单。这是标准的。效果很好。在

通过程序参数接受文件也是如此。很简单。这是标准的。效果很好。作为一个额外的好处,在Windows中CMD.EXE/命令.COM会自动为管道使用临时文件。由于DOS/Windows不支持真正的管道,所以做任何更复杂的事情都没有好处。在

我知道命令行mysql客户机代码在处理管道输入之前接受用户的密码。Linux(可能还有macosx)的解决方案可能与Nemo发布的类似。如果这是你真正想要的行为,而你不在乎Windows,那就是你要使用的解决方案。(对于Windows,您需要使用类似wconio包的东西。http://newcenturycomputers.net/projects/wconio.html

可以让用户输入并接受管道输出到另一个程序。有三个标准文件句柄:stdin、stdout和stderr。即使在stdout被重定向到一个文件时,也可以写入stderr。在

这或多或少起作用:

#!/usr/bin/python

import sys

saved_stdin = sys.stdin
sys.stdin = open('/dev/tty', 'r')
result = raw_input('Enter something: ')
sys.stdout.write('Got: ' + result + '\n')
sys.stdin = saved_stdin
result2 = sys.stdin.read()
sys.stdout.write('Also got: ' + result2)

另存为foo.py,然后尝试echo goodbye | ./foo.py

当然,/dev/tty只存在于Unix上。如果在没有控制终端的进程中运行它,open()可能会失败。。。在

您可以检测您的stdin是否来自管道,就像您使用sys.stdin.isatty一样。你得到了EOF,因为你用stdin.read()读取了all的输入,然后又试图用raw_input()命令读取更多的内容。在

你不能同时做管道输入和交互输入。如果是管道输入,stdin就没有其他的stdin来处理raw_input。唯一的stdin是来自该文件的文件。在

您需要做的是提供一种可选的方法,让脚本的适当部分从文件中读取输入,使用类似于

 input=file.txt

然后为其他部分提供交互式提示。在

相关问题 更多 >