Python 从父进程中断子进程循环
这里缺少什么来打破tok2.py与tok1.py之间的循环 我尝试发送一个包含“exit”的字符串,将发送的值读入我的_输入,并在tok2.py中中断循环 现在tok2永远运行 在Python 3.7中使用Debian 10 Buster tok1.py:Python 从父进程中断子进程循环,python,python-3.x,Python,Python 3.x,这里缺少什么来打破tok2.py与tok1.py之间的循环 我尝试发送一个包含“exit”的字符串,将发送的值读入我的_输入,并在tok2.py中中断循环 现在tok2永远运行 在Python 3.7中使用Debian 10 Buster tok1.py: import sys import time import subprocess command = [sys.executable, 'tok2.py'] proc = subprocess.Popen(command, stdin=su
import sys
import time
import subprocess
command = [sys.executable, 'tok2.py']
proc = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
i=0
while proc.poll() is None:
if i > 5:
#Send 'exit' after 5th iteration
proc.stdin.write(b'exit')
print('tok1: ' + str(i))
time.sleep(0.5)
i=i+1
tok2.py:
import sys
import time
ii=0
my_input =''
while True:
my_input = sys.stdin.read()
if my_input == b'exit':
print('tok2: exiting')
sys.stdout.flush()
break
print('tok2: ' + str(ii))
sys.stdout.flush()
ii=ii+1
time.sleep(0.5)
您可以简单地调用proc.terminate来终止tok2.py进程,这在逻辑上相当于终止循环。由于下面的答案可能不被视为一个优雅的退出,您还可以设置一个环境变量并检查它 tok1.py tok2.py
你应该调查一下,否则这听起来像是一个错误。首先,为什么要发布另一个Python程序?您可以导入它并在另一个线程中运行它。也许我的输入以换行符结尾。您可以尝试。在tok2中,打印my_输入,这样您就可以准确地看到它是什么。是的,这会起作用,但在这种情况下,子进程应该优雅地结束,并在跳出循环之前完成一些工作。@Rimfire-这一点很好。我添加了一个额外的答案,解决了这个问题,我认为。这是行不通的,设置环境变量只会影响新创建的子进程,而不会影响已经运行的子进程。但它确实有效。。。?复制我的代码并运行python3 tok1.py。我相信它是有效的,因为环境变量是在当前shell会话中设置的。它似乎没有连接到子进程。
import sys
import time
import subprocess
import os
command = [sys.executable, 'tok2.py']
proc = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
i=0
while proc.poll() is None:
if i > 5:
#Set 'exit' to 'true' after 5th iteration
os.environ["EXIT"] = "true"
proc.terminate()
print('tok1: ' + str(i))
time.sleep(0.5)
i=i+1
import sys
import time
import os
ii=0
my_input =''
while True:
my_input = sys.stdin.read()
if os.environ['EXIT'] == "true":
print('tok2: exiting')
sys.stdout.flush()
break
print('tok2: ' + str(ii))
sys.stdout.flush()
ii=ii+1
time.sleep(0.5)