Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 17, 2012 22:41:23

ks
От:
Зарегистрирован: 2009-05-20
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

чядн? многопроцессная обработка вывода - подскажите как реализовать

import os
import random
import multiprocessing as mp
def make_4_numbers():
    a = random.randint
    a1, a2, a3, a4 = \
    a(0, 255), a(0, 255), a(0, 255), a(0, 255)
    return '%s.%s.%s.%s' % (a1, a2, a3, a4)
def make_nc_result(ip, port, counter):
    os.popen('nc -w 0 -v %s %s > %s' % (ip, port, counter))
    return open(counter).read()
def f(i):
    return make_nc_result(make_4_numbers(), 22, i)
result = []
pool = mp.Pool(processes=50)
for i in range(100):
    pre_res = pool.apply_async(f, (str(i),))
    rr = pre_res.get(timeout=1)
    result.append(rr)
import pdb
pdb.set_trace()
print(result[0])

Хочу получать вывод netcat штуки, в linux.

Она мгновенно выдает либо none(если судить по пустому output, когда данную команду забиваешь в консоли:
$ nc -w 0 -v ip port), или же строку(иногда - две), с результатом. Подскажите, как это захватить в переменные?



Отредактировано ks (Сен. 17, 2012 22:41:47)

Офлайн

#2 Сен. 18, 2012 09:26:34

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

чядн? многопроцессная обработка вывода - подскажите как реализовать

https://www.google.ru/search?q=subprocess+popen+read

>>> from random import randint
>>> def get_ip():
	return '.'.join([str(randint(0, 255)) for _ in xrange(4)])
>>> get_ip()
'222.201.109.31'



Отредактировано fata1ex (Сен. 18, 2012 09:31:25)

Офлайн

#3 Сен. 18, 2012 11:40:02

ks
От:
Зарегистрирован: 2009-05-20
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

чядн? многопроцессная обработка вывода - подскажите как реализовать

>>> from random import randint
>>> def get_ip():
	return '.'.join([str(randint(0, 255)) for _ in xrange(4)])
>>> get_ip()
'222.201.109.31'
Согласен - так красивее.

fata1ex
https://www.google.ru/search?q=subprocess+popen+read
Но вопрос у меня возник именно исходя из того,
что в примерах которые выдает гугл\оверфлоу - не разобрался.
Вместо os.popen('nc -w 0 -v %s %s > %s' % (ip, port, counter))
Можно написать os.system - это будет аналогично тому что выше на строчку,
тогда по идее весь stdout(а вывод nc -w 0 -v … - это ведь stdout?)
должен попасть в сгенеренный файлик.. чего, собственно, не происходит.

Объясните кто-нить принцип работы (как поймать stdout), или покажите пример. :)



Отредактировано ks (Сен. 18, 2012 11:42:40)

Офлайн

#4 Сен. 18, 2012 12:37:45

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

чядн? многопроцессная обработка вывода - подскажите как реализовать

По ссылке идут примеры с модулем subprocess, а не os, лучше использовать именно его. Ну и примеров там предостаточно на первой же странице, какой смысл копировать их сюда?



Офлайн

#5 Сен. 18, 2012 12:38:02

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

чядн? многопроцессная обработка вывода - подскажите как реализовать

ks
или покажите пример.
def ping(host, timeout=None, count=4):
    params = ["ping", host, "-n", str(count)]
    if timeout is not None:
        params.extend(["-w", str(timeout)])
    process = subprocess.Popen(params,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE)
    out, error = process.communicate()
    ...

Офлайн

#6 Сен. 19, 2012 11:25:42

ks
От:
Зарегистрирован: 2009-05-20
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

чядн? многопроцессная обработка вывода - подскажите как реализовать

fata1ex
Смысл есть.. если кто-то также не разберется, как я - заглянет сюда и ему все станет понятно.

Просто есть некоторые нюансы, которые в работе системных потоков(stderr, stdout) не понятны,
соответственно на основе ваших примеров можно уточнить, где именно не понятно, и почему работает именно так.

def make_nc_result(ip, port, counter):
    os.system('nc -w 0 -v %s %s > %s' % (ip, port, counter))
Почему, например - вот этот код виснет, запускаясь через питон,
и выдает результат мгновенно, если запускать из консоли?

reclosedev
Спасибо! Будет время опробовать, отпишусь о результатах.



Офлайн

#7 Сен. 27, 2012 16:01:50

ks
От:
Зарегистрирован: 2009-05-20
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

чядн? многопроцессная обработка вывода - подскажите как реализовать

>>> import subprocess
>>> p = subprocess.Popen('pssh -H localhost \'echo 1\'', shell=True, stdout=subprocess.PIPE)
>>> res = p.communicate()[0]
>>> res
'[1] 16:55:59 [SUCCESS] localhost\n'

Ура.



Отредактировано ks (Сен. 27, 2012 16:03:55)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version