このテーマを対象としたいくつかの質問があることは既に知っていますが、どれも私の問題を解決しませんでした. または、少なくとも私はそれを見つけることができませんでした。
バックグラウンドでプログラムを実行し、出力を待って操作する必要があります。ただし、バックグラウンド プログラムは実行し続ける必要があります。
私が必要とするバックグラウンド プログラムからの情報は、正確には、その出力の 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 の回答に基づいています。しかし、フェストの答えもうまくいきません。