作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Python 3.5 中做一个 GIT 钩子(Hook)。 python 脚本调用 Bash 脚本,该脚本使用 read
命令读取用户的输入。
bash 脚本本身可以工作,当直接调用 python 脚本时也是如此,但是当 GIT 运行用 Python 编写的钩子(Hook)时,它不会按预期工作,因为没有请求用户输入。
bash 脚本:
#!/usr/bin/env bash
echo -n "Question? [Y/n]: "
read REPLY
GIT 钩子(Hook)(Python 脚本):
#!/usr/bin/env python3
from subprocess import Popen, PIPE
proc = Popen('/path/to/myscript.sh', shell=True, stderr=PIPE, stdout=PIPE)
stdout_raw, stderr_raw= proc.communicate()
当我执行 Python 脚本时,Bash 的 read
似乎没有等待输入,我只得到:
b'\nQuestion? [Y/n]: \n'
如何让 bash 脚本在被 Python 调用时读取输入?
最佳答案
事实证明问题与 Python 无关:如果 GIT 钩子(Hook)调用 bash 脚本,它也无法请求输入。
我找到的解决方案是here .
基本上,解决方案是在 read
之前将以下内容添加到 bash 脚本中:
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty
在我的例子中,我还不得不像 Popen(mybashscript)
而不是 Popen(mybashscript, shell=True, stderr=PIPE, stdout=PIPE))
,因此脚本可以自由输出到 STDOUT,而不是在 PIPE 中捕获。
或者,我没有修改 bash 脚本,而是在 Python 中使用:
sys.stdin = open("/dev/tty", "r")
proc = Popen(h, stdin=sys.stdin)
上述链接的评论中也有建议。
关于python - GIT 钩子(Hook) -> Python -> Bash : How to read user input?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46009781/
我是一名优秀的程序员,十分优秀!