import subprocesswhile True: proc = subprocess.Popen(["python3", "/home/pi/Documents/8-17/simplest.py"]) proc.wait() # 等待子进程执行完毕 if proc.returncode == 0: print("simplest运行正常.....") break simplest是推流程序会一直运行 ,运行中还是无法执行后面的if判断
时间: 2023-12-10 12:38:32 浏览: 41
是的,因为 `subprocess.Popen` 方法会在子进程开始运行后立即返回,而不会等待子进程执行完毕。因此,如果你想要在子进程执行完毕后进行判断,可以使用 `communicate()` 方法等待子进程执行完毕并读取输出。你可以在 `Popen` 对象上调用 `communicate()` 方法,该方法会阻塞并返回一个元组,其中包含子进程的标准输出和标准错误输出。例如:
```
import subprocess
while True:
proc = subprocess.Popen(["python3", "/home/pi/Documents/8-17/simplest.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()
if proc.returncode == 0:
print("simplest运行正常.....")
break
```
在这个例子中,我们将 `stdout` 和 `stderr` 参数设置为 `subprocess.PIPE`,以便在调用 `communicate()` 方法时捕获子进程的输出。然后,我们等待子进程执行完毕并读取输出,最后检查返回代码以确定子进程是否成功执行。
相关问题
import subprocesswhile True: proc = subprocess.Popen(["python3", "/home/pi/Documents/8-17/simplest.py"]) proc.wait() # 等待子进程执行完毕 if proc.returncode == 0: print("simplest运行正常.....") break simplest是一个死循环 我想实现simplest执行中,终端循环打印simplest运行成功
可以使用while循环和try except语句来实现:
```
import subprocess
while True:
proc = subprocess.Popen(["python3", "/home/pi/Documents/8-17/simplest.py"])
try:
while True:
if proc.poll() is not None:
break
print("simplest运行成功.....")
except KeyboardInterrupt:
proc.terminate()
break
```
这里使用了`poll()`方法来检查子进程是否已经结束,如果已经结束,则退出循环。如果捕获到`KeyboardInterrupt`异常(即用户按下Ctrl+C键),则终止子进程并退出循环。
import subprocess while True: proc = subprocess.Popen(["python3", "/home/pi/Documents/8-17/simplest.py"]) try: while True: if proc.poll() is not None: break print("simplest运行成功.....") except KeyboardInterrupt: proc.terminate() break 这样simplest死循环里打印的信息不会出现在终端
这是因为 `subprocess.Popen` 创建的子进程是在独立的进程空间内执行的,并不会把输出打印到终端。要想在终端打印子进程的输出,可以使用 `subprocess.PIPE` 来捕获子进程的标准输出和标准错误输出,然后在父进程中打印出来。修改代码如下:
```python
import subprocess
while 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
```
这样就可以实时打印子进程的输出了。
阅读全文