Python 从父进程中断子进程循环

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

这里缺少什么来打破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=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)