python - Python CLI 脚本中的管道和提示

标签 python linux

是否可以在 Python CLI 脚本中组合管道输入和 TTY 提示?例如,运行这个:

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')  

产生以下输出:

~: python mrprompt.py
Enter something: something
something
~: echo foo | python mrprompt.py
Enter something: Traceback (most recent call last):
  File "mrprompt.py", line 9, in <module>
    user_in = raw_input('Enter something: ')
EOFError: EOF when reading a line

当我正在寻找的输出是这样的:

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

我想,换句话说,子 shell 是否有可能知道其父 shell 的 tty?在 Python 中,是否可以与父 shell 的 tty 交互?我在 GNU Screen 中使用 bash(因此,读取“SSH_TTY”环境变量不是一个可行的选项)。

最佳答案

这或多或少是可行的:

#!/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() 可能会失败...

关于python - Python CLI 脚本中的管道和提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6312819/

相关文章:

python - 递归点字典

linux - 大内存页和碎片

c++ - 与系统命令相比,execve如何防止漏洞

linux - 如何在 RHEL 中将 GCC 从 4.x.x 升级到 GCC 5.x.x?

linux - 使用 Cygwin 安装 Kaldi,zlib 出错

python - 仅在内部使用派生类型的 F2PY 包装过程

python - 创建 python3 virtualenvwrapper 时出错

python - 重写自定义内容类型的方法index_html

windows - 当文件托管在 Ubuntu 服务器上和托管在 Windows 服务器上时,什么会导致字体呈现不同?

python - 以 bcolz 格式保存 dask 数据帧