2016-11-10 4 views
1

Мне нужно реализовать внешнее приложение для вычисления значений CRC для связи по Modbus. Исполняемые требует ввод строки и возвращает такой вывод:Python subprocess.Popen не работает с stdout

CRC16 = 0x67ED/26605 
CRC16 (Modbus) = 0x7CED/31981 

я называю программку, а затем введите вход вручную.

p = Popen(["some_file.exe", "-x"], stdin=PIPE) 
p.communicate("some_string") 

Это работает до сих пор.

Однако я хочу сохранить вывод в переменную или что-то (без дополнительного файла) для дальнейшего использования.

Я знаю, что есть аргументы, STDOUT и STDERR, но когда не печатая

p = Popen([file, "-x"], stdin=PIPE, stdout=PIPE, stderr=PIPE) 

ничего не происходит вообще.

У кого-нибудь есть идея, что делать?

Заранее спасибо.

PS: Использование Python 2.7 на Windows 7.

ответ

1

Чтобы получить выход логинсервера, используйте стандартный вывод = subprocess.PIPE.

proc = subprocess.Popen('ls', stdout=subprocess.PIPE) 
output = proc.stdout.read() 
print output 

Получено от: Pipe subprocess standard output to a variable

Примечание:

Если вы используете STDIN в качестве ТРУБЫ необходимо присвоить значение, как в этом примере:

grep = Popen('grep ntp'.split(), stdin=PIPE, stdout=PIPE) 
ls = Popen('ls /etc'.split(), stdout=grep.stdin) 
output = grep.communicate()[0] 

если значение задается консоль с использованием PIPE, вы должны присвоить значение stdin sys.stdin

+0

Спасибо за ваш ответ. Я не знаю, но это, похоже, не работает. Мне нужно внести свой вклад в программу, поэтому должна быть 'stdin = PIPE'. Использование только этого аргумента в порядке, но добавление 'stdout = PIPE' не является. Я даже не дошел до того, что могу написать переменную 'output = ...' – mulm

+0

@mulm, если вы используете 'stdin = PIPE', вы должны назначить значение stdin, иначе оно будет равно null. –

0

Хорошо, я понял.

Это говорит в старом посте: How do I write to a Python subprocess' stdin?

p.communicate() просто ждет ввода в следующем виде:

p = Popen(["some_file.exe", "-x"], stdout=PIPE, stdin=PIPE, stderr=PIPE) 
output = p.communicate(input="some_string")[0] 

Затем выход имеет всю информацию, полученную.