Как включить модуль Perl, который находится в другом каталоге? - PullRequest
46 голосов
/ 09 мая 2009

Как включить модуль Perl, который находится в другом каталоге? Это должен быть относительный путь от модуля, который его включает.

Я пробовал

push ( @INC,"directory_path/more_path");

также

push ( @INC,"directory_path\\more_path");

Ответы [ 6 ]

68 голосов
/ 09 мая 2009

РЕДАКТИРОВАТЬ: ставить правильное решение в первую очередь, начиная с этот вопрос . Это единственный, который выполняет поиск относительно каталога module :

use FindBin;                 # locate this script
use lib "$FindBin::Bin/..";  # use the parent directory
use yourlib;

Есть много других способов поиска библиотек относительно каталога current . Вы можете вызвать perl с аргументом -I, передав каталог другого модуля:

perl -I.. yourscript.pl

Вы можете включить строку в верхней части вашего Perl-скрипта:

use lib '..';

Вы можете изменить переменную среды PERL5LIB перед запуском скрипта:

export PERL5LIB=$PERL5LIB:..

Стратегия push (@INC) также может работать, но ее нужно заключить в BEGIN {}, чтобы убедиться, что push выполняется до поиска модуля:

BEGIN {push @INC, '..'}
use yourlib;
14 голосов
/ 09 мая 2009

Скорее всего, причина, по которой ваш пуш не сработал, - порядок выполнения.

use - это директива времени компиляции. Вы push сделано во время выполнения:

push ( @INC,"directory_path/more_path");
use Foo.pm;  # In directory path/more_path

Вы можете использовать блок BEGIN, чтобы обойти эту проблему:

BEGIN {
    push ( @INC,"directory_path/more_path");
}
use Foo.pm;  # In directory path/more_path

ИМО, это ясно, и поэтому лучше всего use lib:

use lib "directory_path/more_path";
use Foo.pm;  # In directory path/more_path

См. perlmod для получения информации о BEGIN и других специальных блоках и когда они выполняются.

Редактировать

Для загрузки кода относительно вашего скрипта / библиотеки я настоятельно рекомендую File :: FindLib

Вы можете сказать use File::FindLib 'my/test/libs';, чтобы искать каталог библиотеки в любом месте выше вашего скрипта в пути.

Скажите, что ваша работа структурирована так:

   /home/me/projects/
    |- shared/
    |   |- bin/
    |   `- lib/
    `- ossum-thing/
       `- scripts 
           |- bin/
           `- lib/

Внутри скрипта в ossum-thing/scripts/bin:

use File::FindLib 'lib/';
use File::FindLib 'shared/lib/';

Найдет каталоги вашей библиотеки и добавит их в @INC.

Также полезно создать модуль, содержащий все настройки среды, необходимые для запуска набора инструментов, и просто загрузить его во все исполняемые файлы вашего проекта.

use File::FindLib 'lib/MyEnvironment.pm'
10 голосов
/ 09 мая 2009

'use lib' также может принимать одно строковое значение ...

#!/usr/bin/perl
use lib '<relative-path>';
use <your lib>;
7 голосов
/ 10 мая 2009

С perlfaq8:


Как добавить каталог, в котором находится моя программа, к пути поиска модуля / библиотеки?

(предоставлено Брайаном Д. Фой)

Если вы уже знаете каталог, вы можете добавить его в @INC, как и для любого другого каталога. Вы можете использовать lib, если вы знаете каталог во время компиляции:

use lib $directory;

Хитрость в этой задаче - найти каталог. Прежде чем ваш скрипт сделает что-то еще (например, chdir), вы можете получить текущий рабочий каталог с помощью модуля Cwd, который поставляется с Perl:

BEGIN {
    use Cwd;
    our $directory = cwd;
    }

use lib $directory;

Вы можете сделать аналогичную вещь со значением $ 0, которое содержит имя скрипта. Это может содержать относительный путь, но rel2abs может превратить его в абсолютный путь. Когда у вас есть

BEGIN {
    use File::Spec::Functions qw(rel2abs);
    use File::Basename qw(dirname);

    my $path   = rel2abs( $0 );
    our $directory = dirname( $path );
    }

use lib $directory;

Модуль FindBin, который поставляется с Perl, может работать. Он находит каталог текущего запущенного скрипта и помещает его в $ Bin, который затем можно использовать для построения правильного пути к библиотеке:

use FindBin qw($Bin);
0 голосов
/ 26 октября 2014

Я расскажу вам, как это можно сделать в затмении. Моя система разработки - Windows 64bit, Eclipse Luna, плагин Perlipse для Eclipse, Strawberry Pearl Installer. В качестве интерпретатора я использую perl.exe.

Eclipse> создать новый проект perl> щелкнуть правой кнопкой мыши проект> путь сборки> настроить путь сборки> вкладка библиотеки> добавить папку внешнего источника> перейти в папку, где установлены все ваши модули perl> ok> ok. Готово!

0 голосов
/ 06 августа 2013

Я удивлен, что никто не упомянул об этом раньше, но FindBin :: libs всегда найдет ваших библиотек, поскольку он ищет во всех разумных местах относительно местоположения вашего скрипта.

#!/usr/bin/perl
use FindBin::libs;
use <your lib>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...