12

イベントが発生したときにコードの一部を起動するためにハイパーバイザーにロード/アンロードされるいくつかのスクリプト(私が働いている会社で)に取り組んでいます。スクリプトを実際にアンロードする唯一の方法は、Ctrl-を押すことCです。プロセスを自動化する関数をPythonで書いています

"done"プログラムの出力に文字列が表示されるとすぐに、を強制終了する必要がありvprobeます。私はsubprocess.Popenコマンドを実行するために使用しています:

lineList = buff.readlines()
cmd = "vprobe /vprobe/myhello.emt"
p = subprocess.Popen(args = cmd, shell=True,stdout = buff, universal_newlines = True,preexec_fn=os.setsid)
while not re.search("done",lineList[-1]):
        print "waiting"
os.kill(p.pid,signal.CTRL_C_EVENT)

ご覧のとおりbuff、読み取り+書き込みモードで開いたファイル記述子に出力を書き込んでいます。最後の行を確認します。もしあれば'done'、私はそれを殺します。残念ながら、これCTRL_C_EVENTはWindowsでのみ有効です。Linuxで何ができますか?

4

3 に答える 3

11

signal.SIGINTLinuxに相当するもの(割り込み信号)を送信できると思います。

(編集:サブプロセスを制御するためにこの戦略を使用することを思いとどまらせる何かがここにありましたが、もっと注意深く読むと、この特定のケースではcontrol-Cが必要であるとすでに判断しているように聞こえます...したがって、SIGINTはそれを行う必要があります。)

于 2012-10-23T06:21:07.840 に答える
5

Linuxでは、Ctrl-Cキーボード割り込みは、Popen.send_signal(signal.SIGINT)関数を使用してプログラムでプロセスに送信できます。例えば

import subprocess
import signal

..
process = subprocess.Popen(..)
..
process.send_signal(signal.SIGINT)
..

コマンドをブロックするためにPopen.communicate()を使用しないでください。

于 2015-07-24T18:03:14.303 に答える
4

私は何かを誤解しているかもしれませんが、あなたのやり方では、望ましい結果を得るのは難しいです。

いずれにせよbuff、最初にクエリを実行し、次にのコンテキストで使用してから、Popen()macivlineListによってそれ自体がいっぱいになることを期待します。

あなたがおそらく欲しいのは次のようなものです

logfile = open("mylogfile", "a")
p = subprocess.Popen(['vprobe', '/vprobe/myhello.emt'], stdout=subprocess.PIPE,  buff, universal_newlines=True, preexec_fn=os.setsid)
for line in p.stdout:
    logfile.write(line)
    if re.search("done", line):
        break
    print "waiting"
os.kill(p.pid, signal.CTRL_C_EVENT)

これにより、vprobeスクリプトによってフィードされたパイプの端が得られ、行ごとに読み取り、見つかった出力に適切に作用することができます。

于 2012-10-23T07:12:03.067 に答える