Найти - Пользователи
Полная версия: чядн? многопроцессная обработка вывода - подскажите как реализовать
Начало » Python для экспертов » чядн? многопроцессная обработка вывода - подскажите как реализовать
1
ks
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), или же строку(иногда - две), с результатом. Подскажите, как это захватить в переменные?
fata1ex
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'
ks
>>> 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), или покажите пример. :)
fata1ex
По ссылке идут примеры с модулем subprocess, а не os, лучше использовать именно его. Ну и примеров там предостаточно на первой же странице, какой смысл копировать их сюда?
reclosedev
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()
    ...
ks
fata1ex
Смысл есть.. если кто-то также не разберется, как я - заглянет сюда и ему все станет понятно.

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

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

reclosedev
Спасибо! Будет время опробовать, отпишусь о результатах.
ks
>>> 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'

Ура.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB