Python popen () для выхода при l oop, когда отображается приглашение python - PullRequest
0 голосов
/ 03 марта 2020

Я запускаю python программу (my_file.py), которая в конце процесса становится приглашением python. Поэтому я не могу выбраться из while l oop. p.stdout.readline() ждет, что что-то случится.

Любое предложение, как сломать while l oop. p.pole() также, вероятно, останется null, поскольку с my_file.py связана некоторая автоматизация фона.

Мне нужно, чтобы условие прерывания было подсказкой ">>>" без активности.

import subprocess
from subprocess import Popen, PIPE
import sys, time
for iteration in range(25):
    p=Popen(r"python my_file.py",
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            shell=False,
            encoding='utf-8',
            errors='replace',
            universal_newlines=True)
    while True:
        realtime_output = p.stdout.readline()
        if realtime_output == '': #and p.poll() is not None:
            break
        else:
            print(realtime_output.strip(), flush=True)
    print("--------------- PythonSV session for {} iteration is complete -----------\n\n".format(iteration + 1))
    #subprocess.Popen("taskkill /F /T /PID %i" % p.pid, shell=True)
    Popen.terminate(p)
    time.sleep(1)

Ответы [ 3 ]

0 голосов
/ 03 марта 2020

Как я могу имитировать нажатие клавиши в подпроцессе Python?

https://gist.github.com/waylan/2353749

Когда он входит в Python вы можете выйти из него, введя exit().

Что-то вроде этого (если вас не интересует вывод в реальном времени):

from subprocess import Popen, PIPE

p = Popen(["python", "my_file.py"], stdin=PIPE, stdout=PIPE, stderr=PIPE shell=True)
output, error = p.communicate(input=b'exit()')

Вам необходимо изменить это далее если вы хотите иметь вывод в реальном времени. Ссылка Gist должна дать вам представление о том, как читать и писать одновременно.

0 голосов
/ 03 марта 2020

Попробовал следующую опцию, где read (), пытаясь найти '\ n >>>', является условием прерывания, и оно сработало.

import subprocess
from subprocess import Popen, PIPE
import sys, time
for iteration in range(30):
    p=Popen(["python", r"my_file.py"],
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            shell=False,
            encoding='utf-8',
            errors='replace',
            universal_newlines=True)
    output = ''
    while not output.endswith('\n>>>'):
        c=p.stdout.read(1)
        output+=c
        sys.stdout.write(c)
    Popen.terminate(p)
    time.sleep(1)
0 голосов
/ 03 марта 2020

Вариант 1: вместо разбиения на realtime_output == '', прерывание при получении приглашения Python

Вариант 2: вместо readline() используйте неблокирующее чтение на канале, хотя Надежно работать, очень важно

...