/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Problem med Getopt
Fra : Niels Tolstrup


Dato : 29-09-03 15:05

Hej,

Jeg har et perl program som jeg kalder med system() fra mit c program.
Normalt går det godt, men sommetider dvs, efter et par 1000 kald får
jeg følgende fejl meddelelse:

Can't locate warnings/register.pm in @INC (@INC contains:
/usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/lib/perl5/5.8.0
/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl .) at
/usr/lib/perl5/5.8.0/vars.pm line 7.
BEGIN failed--compilation aborted at /usr/lib/perl5/5.8.0/vars.pm line 7.
Compilation failed in require at /usr/lib/perl5/5.8.0/Getopt/Long.pm line
37.
BEGIN failed--compilation aborted at /usr/lib/perl5/5.8.0/Getopt/Long.pm
line 37.
Compilation failed in require at
/z/armstrong/nt/lnatools/oligodesign/bin/oligod line 181.
BEGIN failed--compilation aborted at
/z/armstrong/nt/lnatools/oligodesign/bin/oligod line 181.
Uhoh: Exit value 512 returned for system(
/z/armstrong/nt/lnatools/oligodesign/bin/oligod -tm tmp_fasta_2D3VI2 >
tmp_tm_sbRKpe)

Den sidste linie der starter med "Uhoh", er mit c program der terminerer
fordi system() kaldet har returneret andet end 0.

Linie 180 og 181 i mit perl program ser således ud:
use strict;
use Getopt::Long;

Mit kald til getopt ser således ud (forkortet):

GetOptions("tm" => \$opt->{ tm},
"verbose+" => \$glb->{ verbose},
"view:s" => \$glb->{ view},
"" => \$opt->{ stdio}
);

Jeg kan naturligvis se at register.pm ligger hvor den skal og kan læses hvor
den skal (/usr/lib/perl5/5.8.0/warnings/register.pm) så jeg forstår ikke
fejl beskeden.

Jeg har også prøvet at køre komandoen som giver fejlen i prompten:
/z/armstrong/nt/lnatools/oligodesign/bin/oligod -tm tmp_fasta_2D3VI2
og den virker fint. tmp_fasta_2D3VI2 er et filnavn, hvis jeg kører komandoen
med et ikke eksisterende filnavn får jeg (korrekt) en fejl om at filen ikke
findes.

Er der nogen der kan hjælpe mig med at forstå ovenstående fejlbesked?

Venlig hilsen

Niels



 
 
Peter J. Acklam (29-09-2003)
Kommentar
Fra : Peter J. Acklam


Dato : 29-09-03 19:31

Niels Tolstrup <nt@nowhere.invalid> wrote:

> Hej,
>
> Jeg har et perl program som jeg kalder med system() fra mit c program.
> Normalt går det godt, men sommetider dvs, efter et par 1000 kald får
> jeg følgende fejl meddelelse:
>
> Can't locate warnings/register.pm in @INC (@INC contains:
> [...]

Hva får du om du skriver, på kommandolinjen

perl -Mwarnings::register -we 1

Peter

--
#!/local/bin/perl5 -wp -*- mode: cperl; coding: iso-8859-1; -*-
# matlab comment stripper (strips comments from Matlab m-files)
s/^((?:(?:[])}\w.]'+|[^'%])+|'[^'\n]*(?:''[^'\n]*)*')*).*/$1/x;

Jacob Bunk Nielsen (29-09-2003)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 29-09-03 19:48

pjacklam@online.no (Peter J. Acklam) writes:
> Niels Tolstrup <nt@nowhere.invalid> wrote:
>
>> Can't locate warnings/register.pm in @INC (@INC contains:
>> [...]
>
> Hva får du om du skriver, på kommandolinjen
>
> perl -Mwarnings::register -we 1

Jeg svarer lige for Niels (jeg har adgang til den maskine Niels
bruger):

$ perl -Mwarnings::register -we 1
$

--
Jacob - www.bunk.cc
We are the people our parents warned us about.

Peter J. Acklam (29-09-2003)
Kommentar
Fra : Peter J. Acklam


Dato : 29-09-03 21:19

Jacob Bunk Nielsen <spam@bunk.cc> wrote:

> pjacklam@online.no (Peter J. Acklam) writes:
>
> > Niels Tolstrup <nt@nowhere.invalid> wrote:
> >
> > > Can't locate warnings/register.pm in @INC (@INC contains:
> > > [...]
> >
> > Hva får du om du skriver, på kommandolinjen
> >
> > perl -Mwarnings::register -we 1
>
> Jeg svarer lige for Niels (jeg har adgang til den maskine Niels
> bruger):
>
> $ perl -Mwarnings::register -we 1

Ok. Det ser ut til å være noe merkelig med miljøet. Jeg har en
mistanke om at det er forskjellige versjoner av perl som kjøres
når programmet kalles på kommandolinjen i forhold til når
programmet kalles fra C-programmet.

Er det samme PATH i de to tilfellene? Gjør C-programmet noen
endringer til PATH?

Peter

--
#!/local/bin/perl5 -wp -*- mode: cperl; coding: iso-8859-1; -*-
# matlab comment stripper (strips comments from Matlab m-files)
s/^((?:(?:[])}\w.]'+|[^'%])+|'[^'\n]*(?:''[^'\n]*)*')*).*/$1/x;

Jacob Bunk Nielsen (29-09-2003)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 29-09-03 21:41

pjacklam@online.no (Peter J. Acklam) writes:

> Ok. Det ser ut til å være noe merkelig med miljøet. Jeg har en
> mistanke om at det er forskjellige versjoner av perl som kjøres
> når programmet kalles på kommandolinjen i forhold til når
> programmet kalles fra C-programmet.

Der er så vidt jeg ved kun en enkelt version af Perl installeret på
den pågældende maskine. Lagde du mærke til at Niels skrev at det gik
godt måske 1000 gange hvorefter det fejler?

> Er det samme PATH i de to tilfellene?

Ja, det er samme bruger/environment. Men PATH burde vel heller ikke
have noget at sige?

> Gjør C-programmet noen endringer til PATH?

Ikke så vidt jeg ved (det er ikke mig der har skrevet programmet, men
jeg tror det næppe). Niels?

--
Jacob - www.bunk.cc
I will always love the false image I had of you.

Peter J. Acklam (30-09-2003)
Kommentar
Fra : Peter J. Acklam


Dato : 30-09-03 07:43

Jacob Bunk Nielsen <spam@bunk.cc> wrote:

> pjacklam@online.no (Peter J. Acklam) writes:
>
> > Ok. Det ser ut til å være noe merkelig med miljøet. Jeg har
> > en mistanke om at det er forskjellige versjoner av perl som
> > kjøres når programmet kalles på kommandolinjen i forhold til
> > når programmet kalles fra C-programmet.
>
> Der er så vidt jeg ved kun en enkelt version af Perl installeret
> på den pågældende maskine. Lagde du mærke til at Niels skrev at
> det gik godt måske 1000 gange hvorefter det fejler?

Ja, jeg leste det Niels skrev og jeg må innrømme at jeg synes det
er veldig merkelig og at jeg bare slenger ut noen forslag til hva
som kan være galt.

> > Er det samme PATH i de to tilfellene?
>
> Ja, det er samme bruger/environment. Men PATH burde vel heller
> ikke have noget at sige?

Det kommer an på hvordan perl-programmet kjøres. Hvis programmet
starter med

#!/usr/bin/env perl
...

eller

#!/bin/sh
...
exec perl ...
...

så vil PATH ha alt å si for hvilken versjon av perl som kjøres.
For eksempel er det en del som har én versjon i /bin/perl og en
annen versjon i /usr/local/bin/perl.

> > Gjør C-programmet noen endringer til PATH?
>
> Ikke så vidt jeg ved (det er ikke mig der har skrevet
> programmet, men jeg tror det næppe). Niels?

Ok. Jeg tror jeg gir opp.

Peter

--
#!/local/bin/perl5 -wp -*- mode: cperl; coding: iso-8859-1; -*-
# matlab comment stripper (strips comments from Matlab m-files)
s/^((?:(?:[])}\w.]'+|[^'%])+|'[^'\n]*(?:''[^'\n]*)*')*).*/$1/x;

Niels Tolstrup (30-09-2003)
Kommentar
Fra : Niels Tolstrup


Dato : 30-09-03 10:31

Niels Tolstrup <nt@nowhere.invalid> wrote:
> Can't locate warnings/register.pm in @INC (@INC contains:

> Uhoh: Exit value 512 returned for system(
> /z/armstrong/nt/lnatools/oligodesign/bin/oligod -tm tmp_fasta_2D3VI2 >
> tmp_tm_sbRKpe)
>

Hermed followup, først tak til Peter og Jacob for sti diskussionen. Og der
er jo nogle filer perl ikke kan finde, så der er et eller andet galt med
stierne. Men da alle filer ligger hvor de skal, og alle stier er sat
korrekt er det åbenbart noget der kun sker under selve kørslen.

pjacklam@online.no (Peter J. Acklam) writes:
> Gjør C-programmet noen endringer til PATH?

Ja i den forstand at filnavnet skifter, tmp_fasta_2D3VI2 er således
genereret af C-programmet med følgende linier:
fd = mkstemp( tmp_fasta_fn);
if( fd == -1 ) {
die( "mkstemp failed");
}

Slår man op i man page til mkstemp, får man at vide at der kan opstå race
problemer hvis man anvender NFS. Og jeg anvender NFS.

Jeg ændrede derfor koden til:

sprintf( tmp_fasta_fn, "tmp_%d.fasta", pid);

Hvor pid er processens pid.
Jeg synes ikke a løsningen er perfekt, fordi jeg jo risikerer at en anden
maskine kører med samme process id, men nu terminerer programmet ikke
længere.

Mit program kører, så jeg er glad, men det er stadig uklart for mig hvorfor
en race condition i NFS kan føre til at perl interpreteren ikke kan finde
en fil i det lokale fil system.

Venlig hilsen

Niels Tolstrup

­­­­­­­­­­­­­-------
"This is a U.S. Government computer system, [...] There is no right of
privacy in this system." from the ncbi ftp site

Jacob Bunk Nielsen (30-09-2003)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 30-09-03 10:48

Niels Tolstrup <nt@nowhere.invalid> writes:

> Jeg ændrede derfor koden til:
>
> sprintf( tmp_fasta_fn, "tmp_%d.fasta", pid);
>
> Hvor pid er processens pid.
> Jeg synes ikke a løsningen er perfekt, fordi jeg jo risikerer at en anden
> maskine kører med samme process id, men nu terminerer programmet ikke
> længere.

Hvad hvis du lader outputtet fra gethostname() (se gethostname(2))
indgå i filnavnet, så burde du vel være sikret?

Fx med noget i retning af:

#define HOSTNAME_LENGTH 100
char hostname[HOSTNAME_LENGTH];
if (gethostname(hostname, HOSTNAME_LENGTH))
exit(-1);

sprintf( tmp_fasta_fn, "tmp_%s_%d.fasta", hostname, pid);

Undskyld at jeg ytrer sådanne modbydeligheder her i Perl-gruppen

Jeg undrer mig også meget over den fejlbesked Perl giver.

--
Jacob - www.bunk.cc
When all other means of communication fail, try words.

Niels Tolstrup (30-09-2003)
Kommentar
Fra : Niels Tolstrup


Dato : 30-09-03 11:38

Jacob Bunk Nielsen wrote:

> Hvad hvis du lader outputtet fra gethostname() (se gethostname(2))
> indgå i filnavnet, så burde du vel være sikret?

Hej Jacob,
Det er sandt, det smerter bare hver gang jeg tilføjer en linie til mit
program som gør den midre portabel, så derfor startede jeg med at skrive:

void set_ranseed(){
time_t tp;

tp = time( NULL);

if( (int)tp == -1) {
/* No warning */
}
srand( (int) tp);
}

Men time() tæller i sekunder, og da jeg jo risikerer at starte min
programmer på samme tid risikere de at få samme seed, så derfor besluttede
jeg mig til at multiplicere med pid, for at få en uniq seed, men så var det
hele ligesom ødelagt og så kunne jeg lige så godt bare bruge pid direkte,
og gå hjem og spise kylling.

Men iøvrigt er jeg enig i at hostname og pid kan hjælpe.

Venlig hilsen

Niels

-----
PS. Jeg kan også godt lide perlehøns...




Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste