2

$EDITOR定義済みまたはを呼び出す必要があるPythonスクリプトがあります$VISUAL。Pythonスクリプトを単独で呼び出すと、$EDITOR問題なく起動できますが、Pythonスクリプトに何かをパイプした瞬間、$EDITORは起動できません。今、私はナノを使用しています。

SIGHUPまたはSIGTERMを受信しました

毎回。ここで説明したのと同じ問題のようです。

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]
4

2 に答える 2

4

何かをプロセスにパイプすると、パイプはそのプロセスの標準入力に接続されます。これは、端末入力がエディターに接続されないことを意味します。ほとんどのエディターは、標準入力が端末 ( isatty ) であるかどうかも確認しますが、パイプはそうではありません。端末でない場合は、起動を拒否します。の場合nano、これにより、含めたメッセージで終了するようです。

% echo | nano
Received SIGHUP or SIGTERM

Python スクリプトの標準入力を端末ベースのエディターに渡せるようにする場合は、ファイル経由など、別の方法で Python スクリプトに入力を提供する必要があります。

これで、Python プロセスをエディターにアタッチしたくないという質問が明確になりましたstdin。次のようにコードを変更できます。

editorprocess = subprocess.Popen([editor or "vi", temppath],
                                 stdin=open('/dev/tty', 'r'))
于 2011-05-13T02:18:37.863 に答える
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')

もちろん、それは標準入力ファイル記述子を閉じます。そのため、エディターの起動後に再度読み取る場合は、おそらく閉じる前にそのファイル記述子を複製する必要があります。

于 2011-05-13T03:11:16.697 に答える