Portál AbcLinuxu, 25. dubna 2024 07:15


Dotaz: perl - cesta k adresáři, kde je script

Přemek Vyhnal avatar 18.9.2008 00:37 Přemek Vyhnal | skóre: 24 | blog: Toto není blog! | Dobřichovice
perl - cesta k adresáři, kde je script
Přečteno: 668×
Odpovědět | Admin
Zdravím

Problém je následující:

mám script v perlu, který potřebuje k práci nějaké další soubory.. např nějaký modul 'Modul.pm' a definici gui 'gui.glade'.

Tyhle soubory jsou ve stejném adresáři jako script a pokud se script spouští ze stejného adresáře (./script.pl), není problém... použije se normálně use Modul nebo Gtk2::GladeXML->new('gui.glade').

Problém nastane, když chci svůj program nějak „nainstalovat“ do systému abych ho mohl spouštět odkudkoliv nebo dokonce dopravit do jiného počítače. Soubory by se hledaly v adresáři, odkud to spouštím. Takže je potřeba nějak nastavit místo, kde je program nainstalován. Nejlépe tak aby se to nemuselo ručně přepisovat když se to nakopíruje jinam ;)

Mám dvě řešení a ani jedno se mi nelíbí. Jak to udělat líp?

1)

přidat do @INC správnou cestu například spuštěním přes perl -I /kde/to/je /kde/to/je/script.pl.

modul se načte správně a přístup k souborům by byl nějak takto: …->new($INC[0].'/gui.glade').

Nevýhoda: musí se to obalit dalším scriptem, který spustí perl se správným parametrem -I a bude tam muset ta cesta být napevno

2)

zjistit cestu z $0 třeba takto: $dir = $0 =~ /(.*)\//; a pak jí v BEGIN přidat do @INC a soubory hledat v $dir

Nevýhoda: Pokud si celý program uložím třeba do /home/neco/neco/... a někde v $PATH na něj udělám symlinky, $0 bude obsahovat cestu k symlinkům a ne tam, kde soubor je opravdu a tam to samozřejmě ty ostatní soubory nenajde.

--

A jako takový poddotaz bych se zeptal kam vlastně takovýto script/program „instalovat“? nechat všechny soubory v jedné složce a tu dát kamkoliv (/home nebo /opt) a v /usr/local/bin udělat symlinky, nebo do /usr/local/bin dát místo symlinku rovnou ten hlavní spustitelný script a ostatní soubory jinam (/usr/local/share/jmenoprogramu/ ?) Pak by zase script nemohl hledat své soubory ve stejné složce jako je sám...

Zároveň bych chtěl aby to stejně fungovalo i v „nenainstalovaném“ stavu při testování – všechno v jednom adresáři v /home/…/…

--

Předem děkuji za jakékoliv tipy jak se tohle řeší
NO RAPTORS!
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

18.9.2008 07:33 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: perl - cesta k adresáři, kde je script
Odpovědět | | Sbalit | Link | Blokovat | Admin

Pro vytvoreni modulu (skript.pl muze byt soucasti modulu) byste mel pouzit standardni mechanizmy (Makefile.PL + instalaci). Viz dokumentace, man perlnewmod, odkazy na dalsi dokumentaci a tutorial tam atd. Vyhoda teto masinerie je, ze mate jeden archiv Vas-Modul-1.0.tar.gz, jehoz standardni instalaci muzete najednou nainstalovat, spustit testy, doresit zavislosti, provest transformaci nejakych retezcu (napr. ony cesty) a dalsi. Timto mechanizmem pro instalaci modulu se Vas::Modul nainstaluje nekam jako /usr/lib/perl5/site_perl/5.10.0/Vas/Modul.pm, pripadne skripty do /usr/bin, kde vse funguje jakychkoliv zasahu. Odinstalace je otazka smazani tohoto souboru nebo adresare Vas.

Pokud chcete nejakou nestandardni cestu (coz lze u "normalniho mechanizmu" docilit take pres --prefix), spravne uvadite, ze musite manipulovat s @INC, a to bud pres -I nebo pomoci use lib (primo se hrabat v @INC neni dobry napad). Do tohoto muzete vice nahlidnout napr. v kapitole 12 perl cookbook. Konkretne v Keeping Your Own Module Directory se toto podrobne rozebira, vcetne metody jak "uhodnout" cestu ke skriptu pomoci modulu FindBin.

Co se tyce nalezeni obecneho souboru v ramci vaseho modulu, doporuciji pouzit hash %INC, kde naleznete cestu, pres kterou se tento modul nasel. Napr. $INC{'Vas::Modul.pm'}.

Jak se na to tak divam, tak to jednou vyda na dalsi dil meho serialu :-)

In Ada the typical infinite loop would normally be terminated by detonation.
18.9.2008 07:35 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: perl - cesta k adresáři, kde je script
Odpovědět | | Sbalit | Link | Blokovat | Admin
v prípade symlinkov si pozri readlink a -l, z toho už cestu poskladáš

tretia možnosť: export PERL5LIB="/home/aaa/lib/perl5:/home/aaa/test/lib/perl5"

Přemek Vyhnal avatar 18.9.2008 10:57 Přemek Vyhnal | skóre: 24 | blog: Toto není blog! | Dobřichovice
Rozbalit Rozbalit vše Re: perl - cesta k adresáři, kde je script
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dík moc vám oboum

ten readlink zdá se bude stačit. Výroba „opravdového“ modulu se mi zatím zdá na mě moc složitá ale třeba se taky zadaří ;)

Díky
NO RAPTORS!
Přemek Vyhnal avatar 18.9.2008 16:00 Přemek Vyhnal | skóre: 24 | blog: Toto není blog! | Dobřichovice
Rozbalit Rozbalit vše Re: perl - cesta k adresáři, kde je script
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak jsem to snad vyřešil:
nějak takto...
use FindBin qw($RealBin);
use lib $RealBin;
use MujModul;
my ($root) = $INC{'MujModul.pm'} =~ /(.*)\//;
…
my $soubor = "$root/soubor.xxx";
Ještě jednou děkuji!
NO RAPTORS!
19.9.2008 21:18 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: perl - cesta k adresáři, kde je script
my ($root) = $INC{'MujModul.pm'} =~ /(.*)\//;

Tuhle vec muzete udelat take pomoci File::Basename nebo neco takovyho a bude to prenositelny i na jiny systemy nez unix. Jinak ten postup je vicemene to co jsem se snazil naznacit. :)

In Ada the typical infinite loop would normally be terminated by detonation.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.