p = subprocess.Popen("python 管理员界面.py", stdout=subprocess.PIPE) while True: output = p.stdout.readline() output_str = output.decode("utf-8").strip() print(output_str)如何判断子进程结束后退出循环
时间: 2024-03-17 12:46:17 浏览: 125
你可以使用 `poll()` 方法来判断子进程是否已经结束。当 `poll()` 方法返回非 None 值时,表示子进程已经结束。你可以在循环中使用 `break` 语句来退出循环。下面是一个示例代码:
```
import subprocess
p = subprocess.Popen("python 管理员界面.py", stdout=subprocess.PIPE)
while True:
output = p.stdout.readline()
output_str = output.decode("utf-8").strip()
print(output_str)
if p.poll() is not None:
break
```
在上面的代码中,我们在每次循环中调用 `poll()` 方法来判断子进程是否已经结束,并在子进程结束后使用 `break` 语句退出循环。
相关问题
def run(self): process = subprocess.Popen(['python', self.script_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) while True: output = process.stdout.readline().decode().strip() if output == '' and process.poll() is not None: break if output: self.output_signal.emit(output)解释下该代码
这段代码是一个 Python 的多线程程序,其中包含一个运行函数 `run`。该函数会启动一个子进程运行指定的 Python 脚本(脚本路径为 `self.script_path`),并将子进程的标准输出和标准错误输出都重定向到 `subprocess.PIPE`,从而可以在主线程中通过 `process.stdout` 来获取子进程的输出。
在 `while` 循环中,通过 `process.stdout.readline()` 方法获取子进程的输出,并将其转换成字符串形式进行处理。如果读取到的输出为空字符串且子进程已经结束运行,就退出循环。如果读取到的输出非空,就通过 `self.output_signal.emit(output)` 发射一个自定义信号,将输出传递给主线程中的槽函数进行处理。这样就可以实现在子进程运行时将其输出实时显示到主界面的功能。
import subprocesswhile True: proc = subprocess.Popen(["python3", "/home/pi/Documents/8-17/simplest.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) try: while True: if proc.poll() is not None: break # 读取子进程的输出 output = proc.stdout.readline().decode().strip() if output: print(output) error = proc.stderr.readline().decode().strip() if error: print(error) except KeyboardInterrupt: proc.terminate() break simplest 里面ffpeg推流打印信息没有在终端输出
这个问题可能是因为 `subprocess` 模块的缓冲机制导致的。可以尝试使用 `subprocess.PIPE` 的 `bufsize` 参数来控制缓冲区大小,或者使用 `subprocess.STDOUT` 将标准输出和标准错误输出合并,以便更好地捕捉子进程的输出信息。比如:
```python
import subprocess
while True:
proc = subprocess.Popen(["python3", "/home/pi/Documents/8-17/simplest.py"],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
try:
while True:
if proc.poll() is not None:
break
# 读取子进程的输出
output = proc.stdout.readline().decode().strip()
if output:
print(output)
proc.wait()
except KeyboardInterrupt:
proc.terminate()
break
```
这里将标准错误输出合并到标准输出中,并使用 `proc.wait()` 等待子进程结束。另外,还可以使用 `universal_newlines=True` 参数将字节流转换为文本流,以便更方便地处理输出。
阅读全文