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

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

27.03.2017, 08:07. Показов 7120. Ответов 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,182
Записей в блоге: 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,182
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru