Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - Вызвать внешний скрипт с параметрами и получить результаты / 17 сообщений из 17, страница 1 из 1
20.04.2012, 11:41:53
    #37762605
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Есть скрипт-диспетчер, который обрабатывает передаваемые ему параметры и в зависимости от них запускает ту или иную процедуру. В запускаемую процедуру он передает какие-то параметры, когда процедура отработает (она должна возвращатькод возврата и желательно какую-то текстовую информацию), пишет в журнал результат выполнения этой процедуры.
Подскажите, как это должно осуществляться?
Сейчас у меня такой скелет для диспетчера (в $rsub имя скрипта-обработчика):
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$log = "handler $rsub";
if ($rsub && -e $rsub)
{
	print "***1\n";
	$ret = do($rsub $arg1 $arg2);
	print "***2\n";
	$val = $@||0;
	print "***3\n";
	$log .= (defined($ret) ? ", обработан" : ", ошибка обработки") . ", результат $val";
}



Не пойму, что должно быть в скрипте-обработчике.
Если в нем выполняется exit, то завершается и скрипт-диспетчер (в консоль выводится только ***1).
Если exit не указан, то после отработки обработчика управление возвращается к диспетчеру, но тогда непонятно, как получить код возврата.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
20.04.2012, 12:24:57
    #37762706
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
С возвратом вроде бы определился.
Если последней строкой в обработчике указать анонимный хэш (в котором будут указаны и код возврата, и текст), в диспетчере его можно получить в $ret.
А как в обработчик передать аргументы?
...
Рейтинг: 0 / 0
20.04.2012, 12:38:47
    #37762744
Nick121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Alibek B.А как в обработчик передать аргументы?

Никак... Можешь использовать их внутри внешнего скрипта как глобальные переменные. Например: $::REG1

И вообще-то это не вызов внешнего скрипта.

do EXPR
Uses the value of EXPR as a filename and executes the contents of the file as a Perl script.
do 'stat.pl';
is just like
eval `cat stat.pl`;
...
Рейтинг: 0 / 0
20.04.2012, 12:44:26
    #37762766
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
А как обычно подобная архитектура (диспетчер + обработчики во внешних файлах) реализуется?
...
Рейтинг: 0 / 0
20.04.2012, 13:28:30
    #37762917
Nick_K_121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Alibek B.,

Ну я бы например сделал через модули.

Например:
файл: m1.pm
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
package m1;
use strict;

sub new
{
    my $proto = shift;
    my %self = @_;
    return bless \%self, $proto;
}

sub run
{
    my $self = shift;
    my @params = @_;
#  делаем что надо
# .......................
    return { #результат
    };
}
1;


нечто аналогичное в m2.pm
файл: script.pl
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#!/usr/bin/perl
use strict;
use m1;
use m2;

my $config = {
  sub1 => 'm1',
  sub2 => 'm2',
};

sub dispatcher
{
    my $what = shift;
    my $res = $config
                      ->{$what}
                      ->new(#инициализируешь данными какими надо
                               )
                      ->run(#передаешь параметры если надо
                              );
}

dispatcher('sub1');



Как-то так. (и exit в модулях вызывать не надо - завершится весь процесс)
Ну а если обрабатывающие скрипты уже написаны и менять что-то лень или нет возможности.
IPC::Run в помощь ( http://search.cpan.org/~toddr/IPC-Run-0.91/lib/IPC/Run.pm)
...
Рейтинг: 0 / 0
20.04.2012, 13:53:50
    #37762979
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Модули не подходят, потому что список обработчиков может меняться.
Сам диспетчер у меня выглядит так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
...
my $arg = shift;
my $rsub = &recognize($arg);
if ($rsub && -e $rsub)
{
  $ret = do($rsub);
  $val = $@||0;
  if ($ret)
  {
    if (ref($ret) eq "HASH")
    {
      ...
    }
    else
    {
      ...
    }
  }
  else
  {
    ...
  }
}
...



При такой схеме мне не нужно изменять диспетчер, чтобы добавить новый обработчик.
Достаточно создать pl-файл с определенным именем и он будет обрабатываться автоматически.
Ну и диспетчер не будет падать, если в каком-то из обработчиков будет синтаксическая ошибка.
...
Рейтинг: 0 / 0
20.04.2012, 14:07:03
    #37763011
Nick_K_121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Alibek B.,

Ну если с IPC::Run связываться не хочется, а хочется через do , то, как я выше написал, через глобальные переменные передавай параметры, должно получиться.
...
Рейтинг: 0 / 0
20.04.2012, 14:13:30
    #37763028
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Да, через глобальные переменные работает.
В диспетчере задаю $::ARG = { ... }, в обработчике выполняю my $ARG = $::ARG, затем в диспетчере обнуляю $::ARG = undef.
Можно ожидать непредвиденные осложнения?
...
Рейтинг: 0 / 0
20.04.2012, 14:43:05
    #37763112
Nick_K_121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Alibek B.Да, через глобальные переменные работает.
В диспетчере задаю $::ARG = { ... }, в обработчике выполняю my $ARG = $::ARG, затем в диспетчере обнуляю $::ARG = undef.
Можно ожидать непредвиденные осложнения?

Работает в один поток? Один процесс? Вроде ничего страшного не должно случиться, кроме того, что глобальные переменные зло :)
Но если система не большая, то и так сойдет.
Можно так подстраховаться: local $::ARG={};
...
Рейтинг: 0 / 0
20.04.2012, 19:31:51
    #37763884
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Alibek B.Модули не подходят, потому что список обработчиков может меняться.Эта фраза ничтожна, так как лишена смысла.
Посмотрите как делается перезагрузка модулей и загрузка модулей в ран тайме.
...
Рейтинг: 0 / 0
20.04.2012, 22:19:17
    #37764023
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
WarstoneПосмотрите как делается перезагрузка модулей и загрузка модулей в ран тайме.
Очевидно для этого структура модуля должна соответствовать определенным правилам.
Внешний же скрипт (хорошо, не внешний, эвалируемый) никакими обременениями в плане структуры не отягощен. Его вообще можно делать полностью автономным, вся разница будет в том, что в одном случае аргументы будут передаваться в @ARGV, в другом в $::ARG.
...
Рейтинг: 0 / 0
20.04.2012, 23:18:15
    #37764090
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Alibek B.WarstoneПосмотрите как делается перезагрузка модулей и загрузка модулей в ран тайме.
Его вообще можно делать полностью автономным, вся разница будет в том, что в одном случае аргументы будут передаваться в @ARGV, в другом в $::ARG.Да ни разу. В случае с модулем параметры будут в @_. В случае с внешним сриптом - параметры будут в @ARGV. А догодаться запускать еще одну копию перла через систем или еще чего - вы не догодались.
...
Рейтинг: 0 / 0
21.04.2012, 13:40:40
    #37764355
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Nick121И вообще-то это не вызов внешнего скрипта.
Напрасно я не обратил на это внимание.
Скрипт эвалируется внутри глобального адресного пространства текущего скрипта.
И соответственно, в нем нельзя подключать модули, объявлять процедуры которые бы конфликтовали с модулями/процедурами скрипта-диспетчера.

С одной стороны есть некоторое удобство — в диспетчере можно написать общие процедуры и из обработчиков просто обращаться к ним.
Но с другой, я полагал что у такого подхода преимуществом будет автономность скриптов-обработчиков (которые полноценно будут работать как при запуске из диспетчера, так и при самостоятельном запуске), а получается, этого преимущества нет и тогда уж лучше использовать pm-модули.
...
Рейтинг: 0 / 0
21.04.2012, 18:55:57
    #37764624
Nick_K_121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Alibek B.Но с другой, я полагал что у такого подхода преимуществом будет автономность скриптов-обработчиков (которые полноценно будут работать как при запуске из диспетчера, так и при самостоятельном запуске), а получается, этого преимущества нет и тогда уж лучше использовать pm-модули.

Ну если это так критично или очень хочется :), еще раз:
IPC::Run в помощь ( http://search.cpan.org/~toddr/IPC-Run-0.91/lib/IPC/Run.pm)

На это тоже не обратили внимания?
...
Рейтинг: 0 / 0
21.04.2012, 20:56:28
    #37764713
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Nick_K_121,

my @res = `perl <scriptname.pl>` вот что надо ТСу.
...
Рейтинг: 0 / 0
21.04.2012, 22:06:38
    #37764765
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Ни IPC::Run, ни вызов второго экземпляра perl я использовать не хочу.
Во-первых, дело происходит в Windows, а там накладные расходы на запуск процессов и на IPC выше, чем в *nix. Запускаться же диспетчер может часто (это обработчик SMS-шлюза), причем он не в бесконечном цикле опрашивает шлюз, а шлюз при поступлении SMS запускает диспетчер, передавая ему необходимые данные.
Во-вторых, это костыли, если уж делать правильно, то с подключаемыми модулями, используя plugin-архитектуру.
Просто я с Perl знаком плохо и в нем не смогу это сделать правильно.
...
Рейтинг: 0 / 0
22.04.2012, 01:07:56
    #37764887
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - Вызвать внешний скрипт с параметрами и получить результаты
Alibek B.,

Ну для начала вам посмотреть как в DBI ищется драйвер DBD. Это поможет вам понять - как искать те или иные плагины (модули) в рантайме.
Дальше... пусть тут меня поправят, но вроде-бы в модулях Apache2 есть код перезагрузки модуля (опять-таки в рантайме) если изменился его код.
Ну и на последок... Берете любой менеджер процессов (я не видел таких в чистом виде, честно говоря) и смотрите как там сделана работа с процессами/потоками.

Эти 3 вещи 99% что уже реализованы в том или ином модуле... Пусть тут подскажут - каком. но вообще, вдумчивый поиск по search.cpan.org даст вам почти все ответы.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - Вызвать внешний скрипт с параметрами и получить результаты / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]