我已经知道有几个针对这个主题的问题,但没有一个能解决我的具体问题。或者至少我找不到它。
我需要在后台执行一些程序,等待输出并对其进行操作。但是后台程序必须一直执行。
我需要的后台程序的信息准确地位于其输出的第二行。如果这个程序阻止我的代码直到到达这一行,就没有问题。但它必须在该行之后解锁,以便我可以执行与后台程序完全无关的其他任务。
不过,我无法弄清楚如何做到这一点。我已经阅读了很多subprocess
模块的文档,特别是subprocess.Popen
.
实用:为什么此代码不适用于['localtunnel', '8000']
参数?它什么也不输出...
我知道我不需要 root 权限来执行此操作。
在 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 的回答。但费斯特的回答也不起作用。