Pythonでスクリプトに配管しながら対話型プログラムを起動できません

StackOverflow https://stackoverflow.com/questions/5986544

質問

私は、定義済みの$EDITORまたは$VISUALを呼び出す必要があるPythonスクリプトを持っています。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]
.

役に立ちましたか?

解決

何かをプロセスに配管するとき、パイプはそのプロセスの標準入力に接続されています。これは、端末入力がエディタに接続されないことを意味します。ほとんどの編集者はまた、標準入力がターミナル( ISATTY )であるか確認してください。どちらのパイプがないかそれがターミナルではない場合、彼らは始めることを拒否します。nanoの場合、これは含めたメッセージで終了するように見えます:

% echo | nano
Received SIGHUP or SIGTERM
.

標準入力を端末ベースのエディタに渡すことができる場合は、ファイルを介してPythonスクリプトに入力を別の方法で入力する必要があります。

今すぐあなたの質問を明確にしました。

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

他のヒント

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')
.

もちろん閉じる閉じた標準入力ファイル記述子であるため、エディタを起動した後に再度読み取ってから、閉じる前にファイル記述子を複製する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top