Простой пример Windows для автоматизации программы.exe с использованием подпроцесса и.Popen
Я новичок в модуле подпроцесса, и после прочтения документов Python среди многих других веб-сайтов (включая переполнение стека), я изо всех сил пытаюсь найти упрощенные примеры .Popen
, .communicate
и другие подобные полезные занятия. Часто примеры никогда не используют каждый класс подряд, только самостоятельно. Кроме того, многие примеры на основе Linux, такие как использование ["ls", "-l"]
, что делает его довольно сложным для понимания пользователями Windows.
После нескольких часов игры с этим модулем я столкнулся с несколькими проблемами, которые лучше всего проиллюстрировать с помощью метода открытия и связи с простой программой командной строки.exe.
Например, скажем, что программа называется "numbers.exe" и задает следующие вопросы:
>>> Question 1) Choose 1, 2 or 3
>>> Question 2) Choose 4, 5 or 6
>>> You have answered #(Q1) and #(Q2)
>>> *Use these values in an iterative sequence displaying each stage in the iteration*
Затем я хочу автоматически манипулировать этой программой, то есть я хочу, чтобы python вводил 2 и 6, без необходимости что-либо делать, но все равно печатать вопросы. Затем я хочу иметь возможность просматривать итерацию в Python.
Первое соображение здесь, что я мог бы использовать:
from subprocess import Popen, PIPE
numprog = subprocess.call('numbers.exe')
print(numprog.communicate())
Тем не менее, это просто открывает программу, и мне все равно придется вводить 2 и 6 самостоятельно. Чтобы автоматизировать процесс, я считаю, что я должен использовать Popen
, наряду со стандартным, стандартным и стандартным. Здесь я сталкиваюсь с проблемами. Я понимаю, что должен использовать Popen, чтобы начать общение с каналами ввода (stdin), output (stdout) и error (stderr):
from subprocess import Popen, PIPE
numcomms = Popen('numbers.exe', stdout=PIPE, stdin=PIPE, stderr=PIPE)
Я не уверен, что делать отсюда. С помощью numcomms.stdout.read()
заставляет программу просто задерживаться, и используя numcomms.stdin.write(2)
выдает ошибку, что значения int нельзя использовать. numprog.communicate
Кажется, класс требует, чтобы вы сами вводили значения.
Из того, что я вижу, псевдокод будет выглядеть следующим образом:
>>> Open numbers.exe stdin, stdout and stderr pipes using Popen
>>> Print first question using stdout
>>> Enter "2" using stdin
>>> Print second question using stdout
>>> Enter "6" using stdin
>>> Receive a string saying "You have answered 2 and 6" using stdout
>>> Display the results of each stage of the iteration using stdout
Как мне написать это?
Очень ценю помощь, спасибо!
Изменить: отредактировал вопрос, чтобы описать проблему итеративной последовательности. Майкл предложил хорошее решение проблемы ввода, однако у меня возникли проблемы с печатью результатов итерации.
2 ответа
Проблема с subprocess.stdin.write
Возможно, вам нужно указать строку вместо целого числа, как правильно указал Стив Барнс.
Тем не менее, для вашего простого случая их может быть более простым решением. communicate
Метод имеет необязательный параметр для ввода, поэтому он должен работать:
from subprocess import Popen, PIPE
numcomms = Popen('numbers.exe', stdout=PIPE, stdin=PIPE, stderr=PIPE)
out, err = numcomms.communicate("2\n6\n")
Вывод программы должен быть в out
впоследствии, и может быть легко разделен с помощью out.splitlines()
,
Я думаю, что ваша проблема с subprocess.stdin.write заключается в том, что программа будет ожидать строку, которая, вероятно, завершится символом новой строки, то есть '2\n', а не int.