3

このテーマを対象としたいくつかの質問があることは既に知っていますが、どれも私の問題を解決しませんでした. または、少なくとも私はそれを見つけることができませんでした。

バックグラウンドでプログラムを実行し、出力を待って操作する必要があります。ただし、バックグラウンド プログラムは実行し続ける必要があります。

私が必要とするバックグラウンド プログラムからの情報は、正確には、その出力の 2 行目にあります。このプログラムがこの行に到達するまでコードをブロックしても問題ありません。ただし、バックグラウンド プログラムとはまったく関係のない他のタスクを実行できるように、その行の後にロックを解除することが不可欠です。

それでも、これを達成する方法がわかりません。モジュールのドキュメントsubprocess、特にsubprocess.Popen.

実用的であること:このコード['localtunnel', '8000']が引数で機能しないのはなぜですか? それは何も出力しません...

これを実行するのにルート権限は必要ありません。


jadkik94 および fest からの回答後に編集

残念ながら、どちらの答えも私にはうまくいきません。たぶん私は何か間違ったことをしている...

初めに。「健全性チェック」:

import subprocess, threading, time
can_break = False

def run():
    args = ["ping", "google.com"]
    popen = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)
    while not can_break:
        print popen.stdout.readline()

t = threading.Thread(target=run)

try:
    t.start()
    while True:
        print 'Main thread...'
        time.sleep(1)
except KeyboardInterrupt:
    can_break = True

上記のコードは、次のような出力で適切に機能します。

Main thread...
PING google.com (74.125.234.160) 56(84) bytes of data.
64 bytes from plusone.google.com (74.125.234.160): icmp_req=1 ttl=54 time=82.5 ms
Main thread...
64 bytes from plusone.google.com (74.125.234.160): icmp_req=2 ttl=54 time=82.7 ms
[...]

しかし、args私が欲しい(args = ['localtunnel', 8000])でそれを使用すると、唯一の出力はMain thread....

メイン スレッド (ブロッキング) で呼び出すlocaltunnelと、目的の出力が返されます。

In [x]: popen = subprocess.Popen(['localtunnel', '8000'])
  This localtunnel service is brought to you by Twilio.
  Port 8000 is now publicly accessible from http://????.localtunnel.com ...

このアプローチは、jadkik94 の回答に基づいています。しかし、フェストの答えもうまくいきません。

4

2 に答える 2

1

プログラムをブロックしない方法で起動し、プログラムの出力を表示するには、プログラムを別のスレッドまたはプロセスで起動する必要があります。Ryan が素敵なコード サンプルをここに投稿しました: Python Subprocess.Popen from a thread

最後の行は、その時点でprint myclass.stdoutどのように表示されるかを出力することに注意してください。プログラムが起動されたばかりの場合、何も出力されていない可能性があるため、必要な行を受け取るまでコードを読み取る必要があります。myclass.stdout

于 2012-05-15T16:44:33.180 に答える
1

スレッドで実行して (コードの実行をブロックしないように)、2 行目が表示されるまで出力を取得してから、終了するまで待ちます。これは、Windows のコマンドからの出力を読み取り、dir /sすべてのディレクトリ リストを取得する例です。

import subprocess, thread, time

def run():
    global can_break

    args = ["dir", "/s"]
    shell = True

    count = 0
    popen = subprocess.Popen(args, shell=shell, stdout=subprocess.PIPE)
    while True:
        line = popen.stdout.readline()
        if line == "": continue
        count += 1
        if count == 2:
            do_something_with(line)
            break

    print "We got our line, we are waiting now"
    popen.wait()
    print "Done."
    can_break = True

def do_something_with(line):
    print '>>> This is it:', line

thread.start_new_thread(run, tuple())

can_break = False
while not can_break:
    print 'Wait'
    time.sleep(1)

print 'Okay!'

出力は次のようになります。

待って
>>> これです: ボリューム シリアル番号は XXXX-XXXX です

列に並びました、今待っています
待って
待って
待って
.
.
.
終わり。
待って
わかった!
于 2012-05-15T17:14:19.070 に答える