Возвращаемое значение child_process в терминале - PullRequest
1 голос
/ 02 апреля 2020

Как я могу вернуть значение python дочернего процесса, который я запустил через main.py с помощью следующего кода:

subprocess.check_output(['lxterminal -e  python3 rfid_input.py'], stdin=subprocess.PIPE, shell=True, close_fds=True)

родительский процесс:

import sys, subprocess
value = subprocess.check_output(['lxterminal -e  python3 rfid_input.py'], stdin=subprocess.PIPE, shell=True, close_fds=True)
print(value)

дочерний процесс содержит простой x=input() и выглядит следующим образом:

import sys
x=input()
sys.stdout.write(x)

, но Ii по-прежнему не получает ничего, кроме пустого b''.

Я также попробовал subprocess.Popen с .wait() и .communicate(), но безуспешно.

Если у вас есть другие идеи, как я могу получить значение ввода lxterminal, пожалуйста, дайте мне я знаю.

1 Ответ

0 голосов
/ 02 апреля 2020

Для передачи данных в stdin ваши настройки обычно выглядят так:

import subprocess

stdin = b"THE DATA YOU PASS"
terminal = subprocess.Popen(["lxterminal", "-e", "python3", "rfid_input.py"],
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)
stdout, stderr = terminal.communicate(stdin)

Когда вы вызываете .communicate без аргументов, он обычно пропускает пустые байты, что может быть и здесь.

Пример шаблона:

Родитель:

import subprocess

stdin = b"THE DATA YOU PASS"
terminal = subprocess.Popen(["python3", "stackoverflow_child.py"],
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)
stdout, stderr = terminal.communicate(stdin)
print(stdout.decode("utf-8"), stderr.decode("utf-8"))

дочерний элемент с именем stackoverflow_child.py:

import sys
x=input()
sys.stdout.write(x * 2)  # so you can see the child was called

Если вы не хотите обрабатывать байты, вы Вы также можете передать encoding="utf-8" в Popen, тогда вы можете передать stdin в виде строки и получить stdout и stderr в виде строки.

...