840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
1

Запустить процесс и передавать ему аргументы

16.05.2014, 22:44. Показов 5065. Ответов 10
Метки нет (Все метки)

Всем доброго времени суток. Тут вопрос, может быть бредовый, но у меня не хватает мозгов что-то разобраться в этом. Вообщем задача( на приметивном уровне): запустить процесс с командой( не важно, можно просто запустить питон в фоне, можно обычную команду "echo" - shell), что бы он весел как дочерний, и скармливать ему аргументы по очереди. Т.е.
Python
1
2
# Запустили процесс, все хорошо.
p = subprocess.Popen(['echo'], stdout=PIPE, stdin=PIPE)
Теперь надо по ходу программы "кидать в процесс аргументы"( ну напримет: '1', потом спустя время '5' и т.д., т.е. ну и что бы выполнялось, в данном случае вывод, не важно пока в какой поток)
Сейчас у меня получается только:
Python
1
2
p = subprocess.Popen(['echo'], stdout=PIPE, stdin=PIPE)
 p.communicate('1234')
Понятно дело второй раз это сделать нельзя, а надо, вопрос как?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2014, 22:44
Ответы с готовыми решениями:

Как передавать аргументы в функцию-обработчик при нажатии на кнопку?
Сейчас озадачился написанием события при нажатии кнопки (gui пишу на tkinter)....

Как передавать в cmd аргументы?
Здравствуйте! Подскажите как передавать в cmd команду ping или любую другую? То есть как правильно...

Как передавать аргументы скрипту IronPython
В C# подключаю ссылки, которые нужны для связи с питоном. Пишу var ipy = Python.CreateRuntime();...

Как передавать аргументы между функциями?
Функции объявлены как static void Foo(ref Double A0, ref Double A1, ref int x); Как нужно объявить...

10
52 / 51 / 15
Регистрация: 27.06.2013
Сообщений: 192
Записей в блоге: 1
17.05.2014, 08:16 2
http://habrahabr.ru/post/151621/
1
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.05.2014, 08:49 3
Цитата Сообщение от Wolkodav Посмотреть сообщение
Понятно дело второй раз это сделать нельзя, а надо, вопрос как?
А точно надо?
В любом случае, communicate закрывает канал. Как обойти - напрямую писать в stdin. Подробнее тут https://gist.github.com/waylan/2353749
1
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
17.05.2014, 13:01  [ТС] 4
Точно, я в этом уверен.

Добавлено через 1 час 8 минут
sanodins, вам спасибо, но увы это будет делаться на лине( это не для вирусов), хотя попробую перенести.
0x10, stdin тоже думал, но тут один минус, к сожалению, stdin дописывает в конец, а мне надо что-то типо: процес запустили, он висит себе, потом ему скормили данные, он отдал данные, он опять висит, потом опять скормили, он отдал ответ, опять висит.
0
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.05.2014, 13:08 5
А сам процесс в принципе реализует такой протокол?
0
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
17.05.2014, 13:09  [ТС] 6
0x10, эмм, а можно вопрос переформулировать?
0
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.05.2014, 13:16 7
Я перестаю что-либо понимать, поэтому давайте с самого начала.
Stdin - это непрерывный поток. Вполне естественно, что данные, отправляемые в него, будут записываться "в конец". Т.е. в любом случае нужен какой-то признак окончания текущей порции данных. Вот я и уточняю: процесс как-то распознает границы сообщений?
0
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
17.05.2014, 13:20  [ТС] 8
0x10, похоже стало доходить.... Т.е. если я скажем напишу скрипт, который будет читать из stdin, и всю логику запихну туда. Создам еще один скрипт, там создам процесс( вызов скрипта) и в процесс буду через stdin пихать данные, то это и будет примерно то, что я хотел. Я правильно понял?
0
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.05.2014, 13:40 9
Пока я пытаюсь что-то понять, вот для примера взаимодействие с cat. Разделитель - символ перевода строки.
Python
1
2
3
4
5
6
7
8
import subprocess
 
p = subprocess.Popen(['cat'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
 
for i in range(3):
    p.stdin.write('msg {}\n'.format(i))
    info = p.stdout.readline()
    print(info)
Добавлено через 17 минут
Подумал еще и понял, что все равно ничего не понимаю.
Как запускаемый процесс обрабатывает поток данных? Это свой скрипт или конкретная утилита?
1
52 / 51 / 15
Регистрация: 27.06.2013
Сообщений: 192
Записей в блоге: 1
17.05.2014, 14:35 10
запусти программу которая ждет на вход строку=buf, и по получению выполняет 'exec'
Python
1
exec(buf, globals())
Добавлено через 9 минут
А так и способ от 0x10, будет работать с любой программой, потому что они все почти работают через аргументы, то есть программа при передаче ей аргументов выполняет какие либо функции
1
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
17.05.2014, 17:20  [ТС] 11
0x10, во, дошло, спасибо. Похоже понял.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2014, 17:20
Помогаю со студенческими работами здесь

Какие аргументы передавать при генерации события?
Пытаюсь разобраться с событиями в С#, делегаты создал. public delegate void...

Зачем передавать аргументы (параметры) в метод main()?
Собственно сабж. Чем это может быть полезно? Где это можно использовать? for (int i = 0; i <...

Как передавать аргументы консольному приложению в Debug?
Я написал программу, не могу найти ошибку и хочу воспользоватся дебаггом. У меян в программу...

А как передавать аргументы и где их определять в функцию main() ?
До сих пор, функция main() была без параметров, а тут пример: int main(int argc, char*argv) {} ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru