我已经知道有几个问题针对这个主题,但是他们都没有解决我的具体问题。或者至少我找不到它。运行并从后台进程获得输出
我需要在后台执行一些程序,等待输出并对其进行处理。 但后台程序必须继续执行。
来自我需要的后台程序的信息恰好位于其输出的第二行。如果此程序阻止我的代码直到到达此行,则不会有任何问题。但重要的是它在该行之后解锁,以便我可以执行与后台程序完全无关的其他任务。
不过,我不知道如何做到这一点。我已经阅读了很多subprocess
模块的文档,特别是subprocess.Popen
。
作为实践:为什么this code不适用于['localtunnel', '8000']
论点?它不输出任何...
我知道我不需要root权限来执行此操作。从jadkik94答案后
编辑和巨星
遗憾的是,答案并不为我工作。也许我做错了什么...
首先。 A“健全检查”:
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...
:
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
上面的代码类似于此输出工作正常。
当我在主线程(阻塞)调用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的答案。但是,费斯特的答案也不起作用。
需要明确的是:在Python脚本是否需要任何后台程序的输出超过第二行?还是只需要让它继续运行? –
第二行后,后台程序可以“隐藏”其输出。 – borges