Запускает две разные команды из подпроцесса и захватывает вывод обоих процессов Python - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь запустить две разные команды, используя подпроцессный модуль python, перехватить вывод из них и распечатать его в консоли ...

XY_thread = Thread (target = run_command_XY)
TEXT_thread =Thread (target = run_command_text)

XY_thread.start ()
TEXT_thread.start ()

, поэтому я получаю выходные данные из XY_thread, а не из TEXT_thread.Когда я чередую потоки и запускаю сначала TEXT_thread, то отображается только вывод TEXT_thread ..

Я поражен, пожалуйста, помогите.Я что-то здесь упускаю?

import subprocess
from subprocess import Popen, PIPE
from threading import Thread


def run_command_text():
    command = "SOME COMMAND"

    process_ = Popen(command.split(), stdout = PIPE, shell = False)

    prev_line = None
    retcode = process_.poll()

    while(process_.poll() == None):
        line_ = process_.stdout.readline().decode('utf-8')

        if "SOME CONDITION" in line_:
        # does some operation and fetches the text(no issues with this part)
            if text != "":
                print(text)         
                prev_line = line_

        if retcode is not None:
            break

def run_command_XY():
    command = "SOME COMMAND"


    process = Popen(command.split(), stdout = PIPE,  shell = False)
    retcode = process.poll()

    while(process.poll() == None):

        line = process.stdout.readline().decode('utf-8')
    # does some operation and fetches the X and Y(no issues with this part)
        print(X+"  "+Y)

        if retcode is not None:
            break

if __name__ == '__main__':

    # multiprocessor = list()

    XY_thread = Thread(target = run_command_XY)
    TEXT_thread = Thread(target = run_command_text)

    XY_thread.start()
    TEXT_thread.start()

Итак, когда я запускаю оба этих метода по отдельности, они выполняют свою работу, как и ожидалось, но когда я пытаюсь запустить их параллельно, а затем печатать оба вывода, тампохоже проблема.(Пожалуйста, игнорируйте отступы)

1 Ответ

0 голосов
/ 25 октября 2018

Я попытался привести небольшой пример запуска двух потоков и проверки вывода процесса в каждом из них.Оба в настоящее время делают одно и то же, но это должно дать вам представление.

import subprocess as sp
from threading import Thread

def func_x():
    cmd = 'python --version'
    for _ in range(5):
        proc = sp.Popen(cmd.split(), stdout=sp.PIPE)
        proc.wait()
        result = proc.stdout.read()
        print('func_x:', result.decode('utf-8').strip())

def func_y():
    cmd = 'python --version'
    for _ in range(5):
        proc = sp.Popen(cmd.split(), stdout=sp.PIPE)
        proc.wait()
        result = proc.stdout.read()
        print('func_y:', result.decode('utf-8').strip())

if __name__ == '__main__':
    x_thread = Thread(target=func_x)
    y_thread = Thread(target=func_y)

    x_thread.start()
    y_thread.start()

Какие результаты:

func_y: Python 3.5.2
func_x: Python 3.5.2
func_y: Python 3.5.2
func_x: Python 3.5.2
func_y: Python 3.5.2
func_x: Python 3.5.2
func_x: Python 3.5.2
func_y: Python 3.5.2
func_y: Python 3.5.2
func_x: Python 3.5.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...