DateTime уже установлен из cpan и cpanm, но все еще не может найти его в @INC - PullRequest
0 голосов
/ 28 октября 2019

Как можно не найти DateTime.pm, даже если я установил его из cpan и cpanm? Но все равно получите ошибку, которую не можете найти в @INC? Это не дубликат, потому что я не спрашиваю о том, кто должен загружать модуль - как я сказал, я пытался установить его из 2 источников, и я сделал, но все равно ошибка Can't locate DateTime.pm in @INC. Я понятия не имею, что я делаю неправильно.

код прост:

#!/usr/bin/perl
use DateTime;
my $t = localtime;
my $now = DateTime->new(
year => $t->year,
month => $t->mon,
day => $t->mday,
);
print $now

и ошибка:

Can't locate DateTime.pm in @INC (you may need to install the DateTime module) (@INC contains:
    /etc/perl
    /usr/local/lib/x86_64-linux-gnu/perl/5.28.1
    /usr/local/share/perl/5.28.1
    /usr/lib/x86_64-linux-gnu/perl5/5.28
    /usr/share/perl5
    /usr/lib/x86_64-linux-gnu/perl/5.28
    /usr/share/perl/5.28
    /usr/local/lib/site_perl
    /usr/lib/x86_64-linux-gnu/perl-base
) at ./a line 2.

Кажется, я не могу найти DateTime.pm, ноУ меня есть они здесь:

/home/shepherd/.cpan/build/DateTime-1.51-0/blib/lib/DateTime.pm
/home/shepherd/.cpan/build/DateTime-1.51-0/lib/DateTime.pm
/home/shepherd/.cpan/build/DateTime-TimeZone-2.37-0/t/lib/T/RequireDateTime.pm
/home/shepherd/.cpanm/work/1572257193.20577/DateTime-1.51/lib/DateTime.pm
/home/shepherd/.cpanm/work/1572257193.20577/DateTime-TimeZone-2.37/t/lib/T/RequireDateTime.pm
/home/shepherd/.cpanm/work/1572257544.21848/DateTime-1.51/lib/DateTime.pm
/home/shepherd/.cpanm/work/1572257544.21848/DateTime-TimeZone-2.37/t/lib/T/RequireDateTime.pm

Что, черт возьми, происходит?


Некоторая информация, которая может быть полезна:

$ which cpan
/usr/bin/cpan

$ head -n 1 `which cpan`
usr/bin/perl

$ which cpanm
/usr/bin/cpanm

$ head -n 1 `which cpanm`
usr/bin/perl

$ /usr/bin/perl -V:'inst.*lib'
installarchlib='/usr/lib/x86_64-linux-gnu/perl/5.28';
installprivlib='/usr/share/perl/5.28'
installsitelib='/usr/local/share/perl/5.28.1'
installvendorlib='/usr/share/perl5'

@INC (when 'use DateTime;')
/etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.28.1
/usr/local/share/perl/5.28.1
/usr/lib/x86_64-linux-gnu/perl5/5.28
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.28
/usr/share/perl/5.28
/usr/local/lib/site_perl
/usr/lib/x86_64-linux-gnu/perl-base

команда set | grep ^PERL ничего не повторяет, я пробовал set | grep -i perl, но только что упоминалось в некоторых операторах if, например: if type perl &> /dev/null; then. И вторая команда echo 'o conf' | cpan такая: Loading internal logger. Log::Log4perl recommended for better logging There seems to be running another CPAN process (pid 2023). Contacting... Other job not responding. Shall I overwrite the lockfile '/home/shepherd/.cpan/.lock'? (Y/n) [y] Ok, bye

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Каталоги, в которых вы видите DateTime (под /home/shepherd/.cpan) - это рабочие каталоги, которые cpan и cpanm используют при установке ваших модулей. Вы не ожидаете, что на самом деле загрузите модули оттуда после их установки - так как другие копии модулей должны быть установлены где-то более постоянным.

Но где они были установлены? Это вопрос. По умолчанию они должны быть установлены где-то на вашем пути по умолчанию @INC, но они явно не там - иначе вы не получите это сообщение об ошибке.

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

1 голос
/ 29 октября 2019

Я думаю, у меня была такая же проблема. Много раз. Когда вы sudo apt-get install libsomething-perl файл DateTime.pm или один из каталогов, в которых он находится, могут быть недоступны для чтения обычному пользователю. (В зависимости от настроек umask или g+s, я думаю)

Чтобы проверить это, посмотрите, доступен ли он как root (sudo) и где он находится, запустив:

sudo perl -le'use DateTime; print $INC{"DateTime.pm"}'

Затем выполните:

sudo ls -ld $(sudo perl -E'use DateTime;@p=split"/",$INC{"DateTime.pm"};say join"/",@p and pop@p while@p>1')

И вы можете увидеть что-то вроде этого:

drwxr-xr-x  root root   4096 Aug 30  2016 /usr
drwxr-xr-x  root root  12288 Oct  9 10:22 /usr/lib
drwxr-xr-x  root root  69632 Oct 23 06:35 /usr/lib/x86_64-linux-gnu
drwxr-xr-x  root root   4096 Aug 30  2016 /usr/lib/x86_64-linux-gnu/perl5
drwxr-xr-x  root root   4096 Oct  9 10:22 /usr/lib/x86_64-linux- gnu/perl5/5.22
-rw-r--r--  root root 123586 Dec 18  2015 /usr/lib/x86_64-linux-gnu/perl5/5.22/DateTime.pm

Если у вашего текущего пользователя нет прав, необходимых для чтения файла DateTime.pm или каталогапопробуйте использовать sudo chown $(whoami) /usr/lib/x86_64-linux-gnu/perl5/5.22/ или sudo chmod a+rx /usr/lib/x86_64-linux-gnu/perl5/5.22/DateTime.pm или аналогичный, чтобы изменить это. (Каталоги в моих примерах здесь, конечно, должны быть заменены на те, что вы получили из команды ls выше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...