Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/89: Рейтинг темы: голосов - 89, средняя оценка - 4.78
6 / 6 / 5
Регистрация: 15.05.2014
Сообщений: 104

Перехват ввода-вывода

24.09.2015, 02:37. Показов 16836. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предположим есть некоторая внешняя программа external.py или external.exe. Программа принмает и печатает данные в консоли. Как, при помощи другой программы работать с этими данными(перехват потоков ввода вывода)?

Вот небольшой пример в нешней программы:
Python
1
2
a = int(input())
print(a)
Из другой программы нужно передать ей число, а в ответ получить от неё же это число. Как это сделать?

Добавлено через 24 минуты
Вообще говоря, я хочу сделать тестер консольных приложений. На вход подаются некоторые данные на выходе получаются тоже данные. Сравнивать ожидаемые данные с полученными. И хотелось бы чтобы работало как с файлами так и с консолью. И хочется, чтобы он работал также просто и прозрачно как класс тестирования, унаследованный от unittest.TestCase
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2015, 02:37
Ответы с готовыми решениями:

Перехват input в console без вывода на экран
Как можно реализовать перехват ввода с клавиатуры в консоли, так чтоб текст не выводился на экран ? Выглядеть должно на подобие...

Перехват потоков ввода/вывода
Проблема в следующем: Имеется консольное приложение, например такое: //1.exe #include <iostream> using namespace std; int...

Перехват потоков ввода/вывода
Уже 2 дня бьюсь над проблемой: на основе примера http://www.sources.ru/cpp/using_anonymous_pipes.shtml запускаю программу (не мою,...

25
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
24.09.2015, 11:07
Почитай о модуле subprocess, с помощью него можно запустить внешнюю программу и подавать ей на стандартный ввод что-нибудь и читать стандартный вывод.

Сдесь есть перевод оф. доки http://john16blog.blogspot.nl/... ocess.html
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
25.09.2015, 08:32
Запуск subprocess.Popen. Чтение my_proc.stdout.readline()
1
Заблокирован
27.09.2015, 12:24
У меня похожий вопрос.
Запускаю консольный проигрыватель, вывод естественно идёт на терминал. Хочу сохранить состояние проигрываемого файла (имя, позиция, громкость и т.д.).
Делал это при помощи subprocess + stdout. Вывод уходит куда нужно но при этом пропадает возможность управлять проигрывателем т.к. вывода в консоль уже нет.
Можно ли как-то не перенаправить поток а продублировать? Пусть себе идёт в консоль и копия направляется в файл.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
28.09.2015, 07:09
Цитата Сообщение от oota9Af Посмотреть сообщение
продублировать? Пусть себе идёт в консоль и копия направляется в файл.
Ну, по-моему, очевидно - то, что получили из stdout - выводите через print.
0
Заблокирован
28.09.2015, 07:19
Цитата Сообщение от dondublon Посмотреть сообщение
то, что получили из stdout - выводите через print.
Совсем не понял что Вы написали. Я ни одного подобного примера не встречал поэтому для меня не очевидно. Напишите подробнее что Вы имели ввиду.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
28.09.2015, 07:30
oota9Af, вам надо продублировать то, что пришло из stdout процесса.
Значит, просто печатайте это через print. Или в файл, как у вас написано.
0
Заблокирован
28.09.2015, 07:34
Да я понимаю что надо сделать, но не понимаю как. Вы не могли бы пример показать?
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
28.09.2015, 07:42
Python
1
2
def on_stdout(line):
   print line
где on_stdout - ваша процедура обработки того что пришло. Или print line замените на вывод в файл.
0
Заблокирован
28.09.2015, 08:08
Думаю что по линиям ничего не выйдет, там ведь постоянно идёт вывод от работы проигрывателя.
Я сейчас вспомню как делал и покажу.

Добавлено через 15 минут
Вот в таком виде есть вывод в консоль и получается интерактивно управлять проигрывателем:
Code
1
2
3
4
song = '/home/user/01.ogg'                                                                          
proc = subprocess.Popen(['mpv', song])                                                                                        
outs, errs = proc.communicate()                                                                                               
print(outs, errs)
Добавлено через 5 минут
Вот в таком виде управление проигрывателем пропадает:
Code
1
2
play = subprocess.Popen(['mpv', song], stdout=subprocess.PIPE)                                                                
vivod = play.stdout.read().strip()
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
28.09.2015, 08:14
communicate - для того, чтобы приложению что-то передавать (а не просто читать его вывод).
0
Заблокирован
28.09.2015, 08:44
Если делать следующим способом, то часть вывода попадает в файл а часть остаётся в консоли и в файл не попадает. Интерактивного управления так-же нет.
Code
1
2
3
4
5
f = open('outfile', 'w')                                                                                                      
proc = subprocess.Popen(['mpv', song], stdout=f)                                                                              
f.close()                                                                                                                     
f = open('outfile', 'r')                                                                                                      
print(f.read())
Для меня никакой очевидности, всё покрыто мраком. Надо как-то из первого способа в файл дублировать.
А может другой способ есть о котором я не знаю.

Добавлено через 3 минуты
Цитата Сообщение от dondublon Посмотреть сообщение
communicate - для того, чтобы приложению что-то передавать
Я всё это пытался написать пол года назад, не вышло плюнул и забыл. Уже не помню что для чего.
Сейчас лихорадочно пытаюсь восстановить из черновиков. Если Вы знаете подскажите.

Добавлено через 22 минуты
Цитата Сообщение от dondublon Посмотреть сообщение
Ну, по-моему, очевидно
Может Вы поторопились с высказываниями?
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
28.09.2015, 08:46
Я пас, слишком много непонятного. Вроде набор инструментов всеобъемлющий.
0
Заблокирован
28.09.2015, 08:51
Ну а сам принцип
Code
1
2
3
4
song = '/home/user/01.ogg'                                                                          
proc = subprocess.Popen(['mpv', song])                                                                                        
outs, errs = proc.communicate()                                                                                               
print(outs, errs)
как это продублировать в файл?
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
28.09.2015, 09:06
Вы же что-то получаете в (outs, errs)? Почему проблема это записать в файл?
0
Заблокирован
28.09.2015, 09:10
Потому что не знаю как это сделать.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
28.09.2015, 09:16
А просто записать в файл "Hello world"?
0
Заблокирован
28.09.2015, 09:18
К примеру если делаю так:
Code
1
2
3
4
proc = subprocess.Popen(['mpv', song])                                                                                        
outs, errs = proc.communicate()                                                                                               
# f = open('outfile', 'w')                                                                                                    
print(outs, errs, file=open('outfile', 'w'))
То в файле: None None
Для Вас же нет проблемм и всё очевидно. Вот и подскажите как.
И не надо ёрничать, появляется подозрение что Вы просто болтаете.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
28.09.2015, 09:32
Я спросил - можете ли вы записать в файл строку "Hello world". Не ёрничаю. Отвечайте на вопрос, от ответа будет зависеть дальнейшее.
0
Заблокирован
28.09.2015, 09:50
Могу. А разве это не видно из предидущего поста? Не ищите глупей себя.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.09.2015, 09:50
Помогаю со студенческими работами здесь

Перехват ввода-вывода другой программы
Имеется игровой сервер, запускается ввиде консоли. В частности, сервер игры CS Source. Нужно сделать так, чтобы я мог получать всю...

Перехват стандартных потоков ввода-вывода
Здравствуйте. Проблема вот в чем: Имеется файл code.exe, который ожидает ввода двух чисел и выдаёт их сумму. Вот его срр-код: ...

Перехват ввода/вывода процесса нестандартными способами
Доброго времени суток! Как перехватить ввод/вывод консольного приложения не прибегая к стандартным способам. Под стандартными способами я...

Перехват потока вывода и ввода из командной строки
Допустим, у меня работает консольное приложение, которое в какой-то момент времени запускает другое консольное приложение, и в него...

Перехват вывода консольного приложения (сложный вариант вывода приложением информации на консоль)
Добрый день. . Столкнулся с такой проблемой. Есть консольное приложение "cisco vpn client 4.7", которое работает как консольное...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru