Hello, I have editted WebDBSeqI.pm but instead of your code I have put Apache2::Subprocess where it says Apache::Subprocess. Then I have tried my script and works ok.
Thank you very much for your help. Best regards, Alicia > On Fri, 2007-04-27 at 11:46 +0200, Alicia Amadoz wrote: > > Ok, I would try it but where should I write that code? maybe at the > > startup.perl file? > > > > Thanks, > > Alicia > > No, you need to find the Bio::DB::WedbDBSeqI module and edit that. > > > > > > On Fri, 2007-04-27 at 10:19 +0200, Clinton Gormley wrote: > > > > On Fri, 2007-04-27 at 09:43 +0200, Alicia Amadoz wrote: > > > > > Hi, > > > > > > > > > > > > > > [error] \n------------- EXCEPTION: Bio::Root::Exception > > > > > -------------\nMSG: Can't locate Apache/SubProcess.pm in @INC (....)\n > > > > > BEGIN failed--compilation aborted at (eval 47) line > > > > > 2.\n\nApache::SubProcess module required for running under > > > > > mod_perl\nSTACK: Error::throw\nSTACK: Bio::Root::Root::throw ... > > > > > > > > The error is that it can't locate Apache::SubProcess, but you're using > > > > mod_perl 2, which uses Apache2::Subprocess. > > > > > > > > > > > > Clint > > > > > > > > > I'm not familiar with bioperl, but doing a code search, it seems that > > > Bio::DB::WebDBSeql has just (v 1.5.2) added the dependency on > > > Apache::SubProcess, but purely as a way of cleaning up the environment > > > after forking: > > > > > > http://doc.bioperl.org/releases/bioperl-1.5.2/Bio/DB/WebDBSeqI.html#CODE25 > > > > > > ---------------------------------------------------------------- > > > sub _open_pipe { > > > my ($self) = @_; > > > > > > if($ENV{MOD_PERL} and ! our $loaded_apache_sp) { > > > eval 'use Apache::SubProcess'; > > > $@ and $self->throw("[EMAIL PROTECTED]::SubProcess module required for > > running under mod_perl"); > > > $loaded_apache_sp = 1; > > > } > > > > > > my $pipe = IO::Pipe->new(); > > > > > > $SIG{CHLD} = 'IGNORE'; > > > defined(my $pid = fork) > > > or $self->throw("Couldn't fork: $!"); > > > > > > unless($pid) { > > > #CHILD > > > $pipe->writer(); > > > > > > #if we're running under mod_perl, clean up some things after this fork > > > if ($ENV{MOD_PERL} and my $r = eval{Apache->request} ) { > > > $r->cleanup_for_exec; > > > #don't read or write the mod_perl parent's tied filehandles > > > close STDIN; close STDOUT; > > > setsid() or $self->throw('Could not detach from parent'); > > > } > > > } else { > > > #PARENT > > > $pipe->reader(); > > > } > > > return ( $pid, $pipe ); > > > } > > > ---------------------------------------------------------------- > > > > > > > > > In mod_perl 2, cleanup_for_exec is no longer required: > > > > > http://perl.apache.org/docs/2.0/user/porting/compat.html#C__r_E_gt_cleanup_for_exec_ > > > > > > So, you could probably just do this (warning : untested) : > > > ---------------------------------------------------------------- > > > my $MP1 = $ENV{MOD_PERL} > > > && ! (exists $ENV{MOD_PERL_API_VERSION} and > > > $ENV{MOD_PERL_API_VERSION} >= 2); > > > > > > sub _open_pipe { > > > my ($self) = @_; > > > > > > if($MP1! our $loaded_apache_sp) { > > > eval 'use Apache::SubProcess'; > > > $@ and $self->throw("[EMAIL PROTECTED]::SubProcess module required for > > running under mod_perl"); > > > $loaded_apache_sp = 1; > > > } > > > > > > my $pipe = IO::Pipe->new(); > > > > > > $SIG{CHLD} = 'IGNORE'; > > > defined(my $pid = fork) > > > or $self->throw("Couldn't fork: $!"); > > > > > > unless($pid) { > > > #CHILD > > > $pipe->writer(); > > > > > > #if we're running under mod_perl, clean up some things after this fork > > > if ($MP1 and my $r = eval{Apache->request} ) { > > > $r->cleanup_for_exec; > > > #don't read or write the mod_perl parent's tied filehandles > > > close STDIN; close STDOUT; > > > setsid() or $self->throw('Could not detach from parent'); > > > } > > > } else { > > > #PARENT > > > $pipe->reader(); > > > } > > > return ( $pid, $pipe ); > > > } > > > > > > > > > > > > > > > >