2017-09-02 76 views
1

我在Python 3.5中做了一個GIT鉤子。 python腳本調用Bash腳本,該腳本使用read命令從用戶讀取輸入。GIT鉤子 - > Python - > Bash:如何讀取用戶輸入?

bash腳本本身也可以工作,當直接調用python腳本時,但是當GIT運行用Python編寫的鉤子時,它不會按預期工作,因爲沒有用戶輸入請求來自用戶。

bash腳本:

#!/usr/bin/env bash 

echo -n "Question? [Y/n]: " 
read REPLY 

GIT鉤(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調用時讀取輸入?

+0

@DYZ>應該是默認行爲:*「使用默認設置None,不會發生重定向; 「* – spectras

+0

@DYZ添加'stdin = sys.stdin'似乎沒有做任何事情...仍然沒有機會鍵入輸入 – arod

+0

@arod>複製粘貼你的代碼,並且在這裏工作正常,只要'.'在'$ PATH'中(這是一個糟糕的主意,儘管你不應該那樣做) – spectras

回答

0

事實證明這個問題與Python無關:如果GIT鉤子調用了bash腳本,它也沒有要求輸入。

我找到的解決方案是here

基本上,解決方案是read之前添加下面的bash腳本:

# Allows us to read user input below, assigns stdin to keyboard 
exec < /dev/tty 

在我的情況,我也只好打電話給bash進程簡直像Popen(mybashscript)代替Popen(mybashscript, shell=True, stderr=PIPE, stdout=PIPE)),所以腳本可以自由輸出到標準輸出並且不會在PIPE中捕獲。

另外,我並沒有修改bash腳本,並在Python代替:

sys.stdin = open("/dev/tty", "r") 
proc = Popen(h, stdin=sys.stdin) 

這也是在上述環節的意見建議。

1

添加

print(stdout_raw) 
print(stderr_raw) 

顯示

b'' 
b'/bin/sh: myscript.sh: command not found\n' 

這裏。將./添加到myscript.sh中,一旦python可以找到該腳本。 CWD = ''在Popen也可能工作。

+0

實際上'myscript.sh'就是一個例子,它實際上是一個絕對路徑'/ myscript.sh' ...仍然不起作用。我糾正了這個問題。 – arod

+0

嗯,你有沒有嘗試另一種形式的閱讀從標準輸入,除bash?這似乎很好奇。像spectras評論,代碼在這裏工作得很好(Fedora 24,Python 3.5.3)。我嘗試了一些C fgets測試,這也起作用。 –

+0

你我們是對的,當直接調用它的工作正常的腳本。我更新了這個問題,添加了從GIT鉤子調用python腳本的細節。 – arod