Как использовать PerlIO :: gzip в непотоковом perl? - PullRequest
0 голосов
/ 03 марта 2020

Недавно сервер, который я использую для анализа биоинформатики, был обновлен до deb10. С тех пор возникло несколько проблем.

Одна из них - это настройка нашего средства просмотра генома JBrowse. Теоретически он запускается с использованием сценария setup.sh, который затем вызывает целую кучу других сценариев для создания правильных файлов JBrowse и проверки настроек et c.

Первоначально он дал мне это сообщение об ошибке:

perl: symbol lookup error: /mnt/data1/www/html/mb/JBrowse-1.12.3/oldbin/../src/perl5/../../extlib/lib/perl5/x86_64-linux-gnu-thread-multi/auto/JSON/XS/XS.so: undefined symbol: Perl_xs_apiversion_bootcheck

После поиска причин, по которым это может быть вызвано, я обнаружил, что это может быть связано с несколькими установками perl, существующими в одной системе, и одной версией, пытающейся загрузить пакеты из Другой. Поэтому я изменил perl, использованный в сценариях, с #!/usr/bin/env perl (perl 5.28) на #!/mnt/data1/commun/tools/perl-5.24.1/perl (perl 5.24), потому что это казалось perl, который предназначался для запуска этих scripts.

Однако после замены я столкнулся с проблемами с PerlIO::gzip. Я идентифицировал скрипт pm, который использовался и который не включал use PerlIO::gzip, и добавил его к нему (Примечание: я не уверен, что это была проблема с ним).

РЕДАКТИРОВАТЬ: Я включил PerlIO::gzip из-за сценария, выдающего мне это сообщение об ошибке:

Unknown PerlIO layer "gzip" at /mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/Bio/JBrowse/Cmd/FormatSequences.pm line 250.

Строка 250 из FormatSequences.pm равна

open $fasta_fh, "<$gzip", $fasta or die "$! reading $fasta";

с $gzip равным '' или ':gzip' в зависимости от того, был ли заархивирован файл для чтения.

Это может быть неправильно (согласно комментарию), но для меня это означало, что мне нужно было указать сценарию, как читать файлы gzip , Заголовок этого модуля теперь выглядит следующим образом:

use strict;
use warnings;

use base 'Bio::JBrowse::Cmd';
use Pod::Usage ();

use File::Spec::Functions qw/ catfile catdir /;
use File::Path 'mkpath';
use File::Copy 'copy';
use File::Basename 'basename';

use POSIX;

use Bio::JBrowse::JSON;
use JsonFileStorage;

use PerlIO::gzip;
##this added by me

use constant ONE_BYTE => 1;
use constant FOUR_BYTE => 4;
use constant BITS_PER_BYTE => 8;
use constant BASES_PER_FOUR_BYTE => 16;

Это не решило проблему, а вместо этого подняло эту ошибку:

Can''t locate PerlIO/gzip.pm in @INC (you may need to install the PerlIO::gzip module) 
(@INC contains:
/mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/../../extlib/lib/perl5/5.24.1/x86_64-linux
/mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/../../extlib/lib/perl5/5.24.1
/mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/../../extlib/lib/perl5/x86_64-linux
/mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/../../extlib/lib/perl5
/mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/../../extlib/lib/perl5/5.24.1/x86_64-linux
/mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/../../extlib/lib/perl5/5.24.1
/mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/../../extlib/lib/perl5
/mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5

/mnt/data1/commun/tools/lib/perl5/site_perl/5.24.1/x86_64-linux
/mnt/data1/commun/tools/lib/perl5/site_perl/5.24.1
/mnt/data1/commun/tools/lib/perl5/5.24.1/x86_64-linux
/mnt/data1/commun/tools/lib/perl5/5.24.1
.
)

См., @INC содержит /mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/../../extlib/lib/perl5/x86_64-linux, но PerlIO::gzip был фактически расположен в /mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/../../extlib/lib/perl5/x86_64-linux-gnu-thread-multi. Я попытался скопировать файлы из x86_64-linux-gnu-thread-multi в x86_64-linux, а также добавить x86_64-linux-gnu-thread-multi в @INC, но оба вызывают эту ошибку:

Can't load '/mnt/data1/www/html/mb/JBrowse-1.12.3/extlib/lib/perl5/x86_64-linux-gnu-thread-multi/auto/PerlIO/gzip/gzip.so' for module PerlIO::gzip: /mnt/data1/www/html/mb/JBrowse-1.12.3/extlib/lib/perl5/x86_64-linux-gnu-thread-multi/auto/PerlIO/gzip/gzip.so: undefined symbol: PL_thr_key at /mnt/data1/commun/tools/lib/perl5/5.24.1/XSLoader.pm line 96.
 at /mnt/data1/www/html/mb/JBrowse-1.12.3/extlib/lib/perl5/x86_64-linux-gnu-thread-multi/PerlIO/gzip.pm line 11.
Compilation failed in require at /mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/Bio/JBrowse/Cmd/FormatSequences.pm line 26.
BEGIN failed--compilation aborted at /mnt/data1/www/html/mb/JBrowse-1.12.3/bin/../src/perl5/Bio/JBrowse/Cmd/FormatSequences.pm line 26.
Compilation failed in require at prepare-refseqs.pl line 7.
BEGIN failed--compilation aborted at prepare-refseqs.pl line 7.

Я предполагаю, что PL_thr_key имеет делать с многопоточными perl, и не подходит для не поточных perl.

Затем я попытался установить PerlIO::gzip в моем домашнем каталоге и использовать local::lib для включения моего домашнего каталога в @INC, как рекомендовал мой сисадмин. Но я в основном сталкиваюсь с той же проблемой, что и раньше: создаются два каталога, x86_64-linux-gnu-thread-multi и x86_64-linux, а PerlIO::gzip существует только в x86_64-linux-gnu-thread-multi.

Так что PerlIO::gzip существует только для многопоточных Perl? Это чувство, которое я получаю от всего этого.

Быстрое примечание: у меня нет прав администратора на это, но при необходимости я могу попросить моего системного администратора установить или обновить модуль. Скажите, пожалуйста, нужна ли какая-либо дополнительная информация о моих perl версиях, или если вы хотите увидеть некоторые из сценариев более подробно.

...