2011-05-13 52 views
2

我有一個python腳本,需要調用定義的$EDITOR$VISUAL。當單獨調用Python腳本時,我可以毫無困難地啓動$EDITOR,但是當我將某些東西傳遞給Python腳本時,$EDITOR無法啓動。現在,我使用納米這表明無法啓動交互式程序,同時在Python中管腳到腳本

收到SIGHUP或SIGTERM

每次

。它似乎是相同的問題described here

sinister:Programming [1313]$ echo "import os;os.system('nano')" > "sample.py" 
sinister:Programming [1314]$ python sample.py 
# nano is successfully launched here. 
sinister:Programming [1315]$ echo "It dies here." | python sample.py 
Received SIGHUP or SIGTERM 

Buffer written to nano.save.1 

編輯:澄清;在節目內部,我沒有向編輯彙報。代碼如下:

editorprocess = subprocess.Popen([editor or "vi", temppath]) 
editorreturncode = os.waitpid(editorprocess.pid, 0)[1] 
+1

你可以粘貼一些簡單的複製代碼嗎? :) – sarnold 2011-05-13 02:08:35

+0

不能抓住你,你想啓動一個編輯器運行一個python腳本,並保持終端輸入作爲標準輸入? – 2011-05-13 07:01:23

+0

@xiao是的,那就是我想要做的。尼古拉斯的解決方案就是這樣做的。 – 2011-05-13 12:22:34

回答

4

當您將某些東西流入進程時,該管道將連接到該進程的標準輸入。這意味着您的終端輸入將不會連接到編輯器。大多數編輯還檢查他們的標準輸入是否是一個終端(isatty),其中一個管道不是;如果它不是終端,他們將拒絕啓動。在nano的情況下,這似乎導致它與你包括在該消息退出:

% echo | nano 
Received SIGHUP or SIGTERM 

您需要提供輸入到你的Python腳本以另一種方式,比如通過一個文件,如果你希望能夠將其標準輸入傳遞給基於終端的編輯器。

現在你已經澄清你的問題,你不希望Python進程的stdin連接到編輯器,你可以修改你的代碼如下:

editorprocess = subprocess.Popen([editor or "vi", temppath], 
           stdin=open('/dev/tty', 'r')) 
+0

@eric,但是'echo hi | vidir'仍然失敗,與您的腳本相同。 '回聲嗨| mutt'甚至不會嘗試啓動編輯器,它會嘗試運行在'mail(1)'式的時尚中...... – sarnold 2011-05-13 02:28:57

+0

好吧,你可以隨意重寫你的內核,但是嚴重的是,這就是Unix類操作系統工作。當'mutt'產生一個編輯器時,它正是因爲這個原因才使用臨時文件。 – 2011-05-13 02:31:44

+0

@sarnold試試'vidir -'; 'find -type f | vidir -' – 2011-05-13 02:32:00

2

find -type f | vidir -的具體情況在這裏處理:

foreach my $item (@ARGV) { 
    if ($item eq "-") { 
     push @dir, map { chomp; $_ } <STDIN>; 
     close STDIN; 
     open(STDIN, "/dev/tty") || die "reopen: $!\n"; 
    } 

您可以重新創建在Python這種行爲,還有:

#!/usr/bin/python 

import os 
import sys 

sys.stdin.close() 
o = os.open("/dev/tty", os.O_RDONLY) 
os.dup2(o, 0) 
os.system('vim') 

當然,它關閉標準輸入文件描述符,所以如果你打算在啓動編輯器後再次讀取它,你應該在關閉它之前複製它的文件描述符。

+0

這也適用,但我將Nicholas的回覆標記爲首選解決方案,因爲它不需要關閉stdin。謝謝。 – 2011-05-13 03:38:09

+0

@Eric,是的,當我看到它時,他的回答讓我感到非常高雅:)對於圖書館例程更加有用。 – sarnold 2011-05-13 03:41:38