2011-09-15 37 views
12

我正在爲Git編寫一個預先提交的鉤子,它運行pyflakes並檢查修改文件中的製表符和尾隨空格(code on Github)。我想通過要求用戶確認,使其可以覆蓋鉤如下:如何在Python Git鉤子中使用raw_input()?

answer = raw_input('Commit anyway? [N/y] ') 
if answer.strip()[0].lower() == 'y': 
    print >> sys.stderr, 'Committing anyway.' 
    sys.exit(0) 
else: 
    print >> sys.stderr, 'Commit aborted.' 
    sys.exit(1) 

此代碼產生一個錯誤:

Commit anyway? [N/y] Traceback (most recent call last): 
    File ".git/hooks/pre-commit", line 59, in ? 
    main() 
    File ".git/hooks/pre-commit", line 20, in main 
    answer = raw_input('Commit anyway? [N/y] ') 
EOFError: EOF when reading a line 

它甚至有可能使用的raw_input()或在Git鉤子中有類似的功能,如果是的話,我做錯了什麼?

回答

15

你可以使用:

sys.stdin = open('/dev/tty') 
answer = raw_input('Commit anyway? [N/y] ') 
if answer.strip().lower().startswith('y'): 
    ... 

git commit電話python .git/hooks/pre-commit

% ps axu 
... 
unutbu 21801 0.0 0.1 6348 1520 pts/1 S+ 17:44 0:00 git commit -am line 5a 
unutbu 21802 0.1 0.2 5708 2944 pts/1 S+ 17:44 0:00 python .git/hooks/pre-commit 

/proc/21802/fd展望(在此Linux框)顯示文件描述符的狀態與PID的進程21802(pre-commit處理):

/proc/21802/fd: 
    lrwx------ 1 unutbu unutbu 64 2011-09-15 17:45 0 -> /dev/null 
    lrwx------ 1 unutbu unutbu 64 2011-09-15 17:45 1 -> /dev/pts/1 
    lrwx------ 1 unutbu unutbu 64 2011-09-15 17:45 2 -> /dev/pts/1 
    lr-x------ 1 unutbu unutbu 64 2011-09-15 17:45 3 -> /dev/tty 
    lr-x------ 1 unutbu unutbu 64 2011-09-15 17:45 5 -> /dev/null 

因此,pre-commit產生了sys.stdin指向/dev/nullsys.stdin = open('/dev/tty')sys.stdin重定向到一個打開的文件句柄,其中raw_input可以讀取該文件句柄。

+0

這完美的作品。謝謝。 – badzil

-1

在外殼,您可以:

read ANSWER < /dev/tty 
+0

這個Python如何? – badzil