Уведомления

Группа в Telegram: @pythonsu

#1 Май 29, 2013 18:31:24

Virtul
От:
Зарегистрирован: 2012-01-27
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Эквивалент bash'овского read

День добрый, подскажите, пожалуйста, как добиться сто процентной копии работы такого простенького башовского скрипта:

#!/bin/sh
while read line; do
    echo "ERR!$line"
done

В системке racktables есть поддержка неких gateways - php код банально вызывает внешние скрипты передавая в них команды на stdin и читает stdout
собственно код выше - работает, этот тоже:
#!/bin/env perl
while (<>) {
    print;
}

Но запустить пайтон скрипты никак не выходит - пробовал raw_input(), os.stdin, fileinput.input() но ни в какую, поможите кто чем может пожалуйста :) Заранее благодарю



Отредактировано Virtul (Май 29, 2013 18:35:38)

Офлайн

#2 Май 29, 2013 19:20:43

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Эквивалент bash'овского read

import sys
data = sys.stdin.read()
в data - будет то, что пришло на вход

Отредактировано s0rg (Май 29, 2013 20:10:24)

Офлайн

#3 Май 29, 2013 19:29:22

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Эквивалент bash'овского read

while not raw_input() == False:
	print "ERR!$line"
или
while True:
	raw_input()
	print "ERR!$line"



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Май 29, 2013 19:32:15)

Офлайн

#4 Май 29, 2013 22:49:10

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Эквивалент bash'овского read

2.x:

import sys
for x in sys.stdin:
    print x,
3.x
import sys
for x in sys.stdin:
    print(x, end="")



Офлайн

#5 Май 30, 2013 10:28:46

Virtul
От:
Зарегистрирован: 2012-01-27
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Эквивалент bash'овского read

Всем спасибо, но ни один предложенный вариант не сработал, я понятия не имею в чём разница (с консоли всё выглядит одинаково), но работал только вот такой вариант:

#!/bin/env python2.6
import sys
line = sys.stdin.readline()
while line:
    print line,
    line = sys.stdin.readline()

Найдётся ли знаток, который объяснит разницу? :)

Вот вызывающая функция php:
function queryGateway ($gwname, $questions)
{
	global $racktables_gwdir;
	$execpath = "${racktables_gwdir}/{$gwname}/main";
	$dspec = array
	(
		0 => array ("pipe", "r"),
		1 => array ("pipe", "w"),
		2 => array ("file", "/dev/null", "a")
	);
	$pipes = array();
	$gateway = proc_open ($execpath, $dspec, $pipes);
	if (!is_resource ($gateway))
		return array ('ERR proc_open() failed in ' . __FUNCTION__);
	foreach ($questions as $q)
		fwrite ($pipes[0], "$q\n");
	fclose ($pipes[0]);
	$answers = array ();
	while (!feof($pipes[1]))
	{
		$a = fgets ($pipes[1]);
		if (!strlen ($a))
			continue;
		// Somehow I got a space appended at the end. Kick it.
		$answers[] = trim ($a);
	}
	fclose($pipes[1]);
	$retval = proc_close ($gateway);
	if ($retval != 0)
		throw new RTGatewayError ("gateway failed with code ${retval}");
	if (!count ($answers))
		throw new RTGatewayError ('no response from gateway');
	if (count ($answers) != count ($questions))
		throw new RTGatewayError ('protocol violation');
	foreach ($answers as $a)
		if (strpos ($a, 'OK!') !== 0)
			throw new RTGatewayError ("subcommand failed with status: ${a}");
	return $answers;
}

а вот этот код вообще вешает страницу с вызовом queryGateway намертво:
#!/bin/env python2.6
import sys
while 1:
    x = sys.stdin.readline()
    print x,



Отредактировано Virtul (Май 30, 2013 10:44:03)

Офлайн

#6 Май 30, 2013 16:42:41

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Эквивалент bash'овского read

Virtul
ни один предложенный вариант не сработал, я понятия не имею в чём разница
Virtul
а вот этот код вообще вешает страницу с вызовом queryGateway намертво:
Есть мнение, что это все из-за буфферизации, вам нужно посмотреть в доках php (сам с ним, почти, не работаю) как ее отключить для ваших каналов.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version