2017-09-02 16 views
1

私はPython 3.5でGITフックをやっています。 Pythonスクリプトは、readコマンドを使用してユーザーからの入力を読み取るBashスクリプトを呼び出します。GITフック - > Python - > Bash:ユーザー入力の読み方?

bashスクリプトは、Pythonスクリプトを直接呼び出すときにも動作しますが、GITがPythonで書かれたフックを実行すると、ユーザーからのユーザー入力が要求されないため期待どおりに動作しません。

bashスクリプト:

#!/usr/bin/env bash 

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

GITフック(Pythonスクリプト):私は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() 

、バッシュのreadが入力を待っているように見える、と私だけはありませんget:

b'\nQuestion? [Y/n]: \n' 

Pythonから呼び出されたときにbashスクリプトに入力を読み込ませる方法を教えてください。追加

print(stdout_raw) 
print(stderr_raw) 

+0

@DYZ>デフォルトの動作にする必要があります。* "デフォルト設定が[なし]の場合、リダイレクトは行われません。子供のファイルハンドルは親から継承されます "* – 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 

私の場合、私はまた、単にPopen(mybashscript)代わりのPopen(mybashscript, shell=True, stderr=PIPE, stdout=PIPE))のようにbashのプロセスを呼び出す必要があったため、スクリプトSTDOUTに自由に出力でき、PIPEに取り込まれることはありません。

代わりに、私はbashスクリプトを変更し、代わりにPythonで使用されていない:

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

また、前述のリンクのコメントで提案されています。

1

はここ

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

表示します。 ./をmyscript.shに追加すると、Pythonはスクリプトを見つけることができるようになりました。 cwd = '。'ポピンでも働くかもしれない。

+0

実際には 'myscript.sh'が例ですが、実際には絶対パス'/myscript.sh'です...まだ動作しません。私はその問題を修正した。 – arod

+0

ええと、bash以外のstdinから別の形式の読み込みを試みましたか?これは興味深いようです。スペクトラがコメントしたように、コードはここでうまくいきます(Fedora 24、Python 3.5.3)。私は小さなC fgetsテストを試してみましたが、それもうまくいきました。 –

+0

私たちは、スクリプトを直接呼び出すとうまくいきました。 PythonスクリプトがGITフックから呼び出されたという詳細を追加して質問を更新しました。 – arod

関連する問題