4

ここで 2 番目の回答に似たようなことをしたい (ただし、まったく似ていない): Linux で作業中に Python で Ctrl-C キーボード割り込みをシミュレートする

それははるかに単純で、何かが欠けているだけだと思います。たとえば、Python スクリプトから、「ping」を呼び出して 10 回目に終了させたいだけだとします。上記のリンクのようにしようとしています:

p = subprocess.Popen(['ping', 'google.com'], stdout=subprocess.PIPE)
for line in p.stdout:
  print line
  if re.search('10', line):
    break
os.kill(p.pid, signal.SIGINT)

しかし、うまくいきません。

また、「ping」の通常の出力も表示されるようにします。どうすればいいですか?

編集:実際にやりたいのは「ping」ではありません。連続出力を伴うコマンドの例として使用しているだけで、そのうち終了したいと思います。

より具体的には、古いバージョンの BitTorrent (ここの 3 番目の回答の v5.0.9: BitTorrent ソース コードはどこにありますか? ) を実行しており、Python スクリプトを介して呼び出しています。bittorrent-console.py は単純な端末バージョンであるため、「コンソール」です。定期的に複数行出力します。何かのようなもの:

saving:       filename
file size:    blah
percent done: 100.0
blah:         blahblah

私は実際にそれを次のように呼んでいます:

subprocess.call(['./bittorrent-console.py', 'something.torrent'])

'percent done:' が 100.0 になったら自動的に終了させたいです。

編集: CentOS、Python 2.6 で実行しています。

4

2 に答える 2

2

まず、 を使用しますp.stdout.readline。理由はわかりfor line in p.stdoutませんが、フラッシュしないようです。バッファリングされているのかもしれません。

次に、常に何かを追加するsys.stdout.write(line)ため、を使用する必要があります。printただし、 Python 3 では を使用できますprint(line, end="")

また、 を優先p.killする必要がありますos.kill。を使用している理由がわかりませんos.kill

import os
import signal
import subprocess
import sys

p = subprocess.Popen(['ping', 'google.com'], stdout=subprocess.PIPE)
while True:
    line = p.stdout.readline()

    sys.stdout.write(line)
    sys.stdout.flush()
    if '10' in line:
        break

p.kill()
于 2013-09-27T20:53:39.517 に答える