С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
1 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 37

Subprocess, ввод данных при запросе

27.03.2017, 08:07. Показов 7054. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня, задача следующая.
Есть некая утилита, пусть будет test.exe
При ее запуске(cmd) утилита выдает некий текст (их нужно отловить), и ждет ввода данных от пользователя.
После того как будет введены данные + enter выдается следующая порция текста которые тоже необходимо отловить и сохранить.
Пробую реализовать эти действия через python + subprocess

запускаю утилиту
Python
1
2
import subprocess
p=subprocess.Popen("test.exe", stdin =subprocess.PIPE, stdout =subprocess.PIPE, stderr =subprocess.PIPE )
теперь нужно отловить первую порцию текста и ввести данные.
Если делаю так
Python
1
2
3
4
5
6
out = "   "
while out:
    out = p.stdout.readline()
    print(out)
 
p.stdin.write("текст от пользователя \n")
То вывод печатается пока не упрется в "приглашение ввести данные" и висит бесконечно к следующей команде не переходит.
Прошу помощи, спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2017, 08:07
Ответы с готовыми решениями:

Ввод в терминал открытый через subprocess
Через subprocess отрыл терминал, но не знаю как мне отдавать ему команды через IDLE. Как можно вводить команды терминалу через IDLE? ...

Редактирование - ввод данных в запросе с группировкой
Может кто знает способ изменения данных в запросе с группировкой? Пока не включаю группировку все ОК.

Ввод данных через поле, для условия отбора в запросе
Добрый день. Access'ом пользуюсь недавно и при формировании отчета на основе запроса, возникла проблема. Можно ли реализовать форму и...

4
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,181
Записей в блоге: 6
27.03.2017, 11:20
Используйте Popen.communicate.
0
1 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 37
27.03.2017, 12:38  [ТС]
Не совсем понимаю где и как его использовать,

Python
1
2
3
import subprocess
p=subprocess.Popen("test.exe", stdin =subprocess.PIPE, stdout =subprocess.PIPE, stderr =subprocess.PIPE )
p.communicate("текст от пользователя \n")
Если да, то на строчке p.communicate("текст от пользователя \n") застревает...

Добавлено через 6 минут
пробовал с
out, err = p.communicate("текст от пользователя \n")

так же на нем зависает
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,181
Записей в блоге: 6
27.03.2017, 14:08
Ну не знаю, должно работать. Использовать так, да.
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
27.03.2017, 16:19
ainur_fa, зависать не должно, но ругаться - да: по умолчанию аргумент communicate должен быть bytes, или строкой, если universal_newlines = True; то бишь
Python
1
2
3
4
5
6
7
8
from subprocess import Popen, PIPE
 
usertext = "текст от пользователя \n"
command = r"test.exe"
 
p = Popen(command, stdout=PIPE, stdin=PIPE, universal_newlines=True)
out, err = p.communicate(usertext)
print(out)
Впрочем, зависать не будет, если скормить сразу все необходимые данные. В этом случае они будут лежать в буфере, и приложение будет забирать их оттуда по мере надобности, не блокируя питонячьи потоки.

Если требуется интерактивность, можно сварганить что-нибудь вроде такого
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from subprocess import Popen, PIPE
import sys
import os
 
 
def search(data, prompt):
    return data.find(prompt)
        
        
 
maxread = 1024
linesep = os.linesep.encode()
 
 
command = r'test.exe'
userinputs = ['pass', 'other']
prompts = ['first', 'second']
 
userinputs = map(str.encode, userinputs)
prompts = map(str.encode, prompts)
inout = zip(prompts, userinputs)
prompt, userinput = next(inout)
 
buffer = bytes()
 
child = Popen(command, stdout=PIPE, stdin=PIPE,  bufsize=0)
 
while True:
    data = child.stdout.read(maxread)
  
    if not data: break
    
    print ('s = ', data, flush=True)
    
    buffer += data
    idx = search(buffer, prompt)
    
    if idx >= 0:
        child.stdin.write(userinput + linesep)
        buffer = buffer[idx + len(prompt):]
 
        prompt, userinput = next(inout, (prompt, userinput))


Или лучше, вместо своих велосипедов, pexpect
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.03.2017, 16:19
Помогаю со студенческими работами здесь

Ошибка при компиляции subprocess.py
Здравствуйте. Помогите новичку, столкнулся с проблемой с subprocess.py при компиляции

Разобраться с кодировкой при передачи в subprocess
Здравствуйте! в Python новичок необходимо запустить из под Python стороннюю консольную программу, ввести аргументы и получить результат...

Кодировка stdout при работе с subprocess.Popen
У меня Виндоус, а следовательно кодировка комманд, выполняемых в cmd определяется локалью же, да?! Ну короче это cp1251. А вот кодировка...

Получить массив при использовании subprocess.check_output
передаю в r файл массив и возвращаю результат обратно import subprocess import sys command = r'C:/Program...

Получение данных при запросе
Приветсвую. Помогите плиз нубу. Никак не могу понять одну вещь. Везде описано, как ВСЮ таблицу загрузить в DBGrid. Мне нужно другое: мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru