LINUX.ORG.RU

Perl. конфликт модулей? cant locate object method.


0

1

Доброго времени суток.

use strict;
use Net::Telnet;
use Net::SSH::Expect;

[...]
    print_log("start");
    my $ssh=Net::SSH::Expect->new(
        user    => $user,
        host    => $host,
        password    => $pass,
        raw_pty => 1
    );
    $ssh->login();

при выполнении -

2011/06/11 18:09:30: start
Can't locate object method "autoflush" via package "FileHandle" at /usr/share/perl5/Expect.pm line 107.

Убираю use Net::Telnet, - ошибка исчезает. Net::Telnet из дистрибутива Debian, Net::SSH::Expect - из CPAN.

Кто-нибудь сталкивался с конфликтом модулей? Есть ли возможность обойти?

★★★★★

Последнее исправление: router (всего исправлений: 1)

Посмотрел чуть подробнее на пространство имён %main::

после use Net::Telnet в нём появляется пространство имён FileHandle::

Думаю, что с этим знанием делать дальше

router ★★★★★
() автор топика
Ответ на: комментарий от arsi

УМНХРЭТНР.

Ладно, вместо use Net::Telnet делаю require Net::Telnet в отдельном sub, где telnet нужен. Скорость работы не важна, зато работает.

router ★★★★★
() автор топика
Ответ на: комментарий от router

> require Net::Telnet

use Net::Telnet (); даст такой же результат. какая версия модуля? попробуй поставить cpan’овский вместо дистрибного.

arsi ★★★★★
()
Ответ на: комментарий от arsi

>use Net::Telnet ();

Нет, не даст, проверил. Я не слишком разбираюсь в экспорте имён в модулях perl, но в Net::Telnet в явном виде используется Exporter и @ISA

Поставить модуль из CPAN сейчас попробую

router ★★★★★
() автор топика
Ответ на: комментарий от router

эх, весело у вас там в дебиане…

bash$ grep -v password test.pl
#!/usr/bin/perl

use strict;
use Net::Telnet;
use Net::SSH::Expect;

my $ssh = Net::SSH::Expect->new(
    user     => 'arsi',
    host     => 'localhost',
    raw_pty  => 1
);

$ssh->login();
print $ssh->exec('cat /etc/slackware-version');

bash$ ./test.pl
Slackware 13.37.0
bash$ _

может это не Net::Telnet виноват? можно на весь код посмотреть?

arsi ★★★★★
()
Ответ на: комментарий от arsi

может это не Net::Telnet виноват? можно на весь код посмотреть?

В коде пока смотреть не на что, один telnet, а для ssh заглушка. Проблема воспроизводится на таком тесте:

#!/usr/bin/perl

use strict;
#use IO::Handle;
use Net::Telnet;
use Net::SSH::Expect;
my $user="a";
my $host="b";
my $pass="c";

    #print_log("start");
    my $ssh=Net::SSH::Expect->new(
        user    => $user,
        host    => $host,
        password    => $pass,
        raw_pty => 1
    );
    $ssh->login();

Кто виноват - пока не знаю. Но в Net::Telnet нашёл очень странный кусок кода:

    if ($INC{"IO/Handle.pm"}) {
        return IO::Handle->new;
    }
    else {
       require FileHandle;
       return FileHandle->new;
    }

закомментировал всю проверку и оставил только

return IO::Handle->new;

После этого Net::Telnet продолжил работать, но перестал экспортировать FileHandle:: в %main::

Странная какая-то была проверка, модуль IO::Handle есть и импортируется без ошибок...

router ★★★★★
() автор топика
Ответ на: комментарий от router

И ещё. Если я меняю порядок импорта модулей, проблема перестаёт воспроизводиться даже без правки Net::Telnet

use Net::SSH::Expect;
use Net::Telnet;

router ★★★★★
() автор топика
Ответ на: комментарий от router

> закомментировал всю проверку […] После этого Net::Telnet продолжил работать, но перестал экспортировать FileHandle:: в %main::

странно всё это…

bash$ perl -MNet::Telnet -E 'say $INC{"IO/Handle.pm"}'
/usr/lib64/perl5/IO/Handle.pm
bash$ _

сам Net::Telnet не грузит IO::Handle. похоже, он надеется, что его загрузят другие модули, но его надежды не оправдываются… рекомендую обновить перл ;)

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.