[Bioperl-l] Bemusement with get_seq_by_gi in a CGI script
Jason Stajich
jason at cgt.duhs.duke.edu
Wed Aug 20 13:05:12 EDT 2003
> So your script is doing what it's supposed to, it's just that some other
> stuff is getting out on STDOUT before your webserver is able to get in
> on the act.
>
> Having played a bit, this proves to be interesting:
>
> #!/usr/bin/perl -w
> use strict;
> use Bio::DB::GenBank;
>
> close STDOUT;
>
> my $d = Bio::DB::GenBank->new();
> my $seq = $d -> get_Seq_by_gi('163483');
>
>
> This gives me:
>
> print() on closed filehandle STDOUT at
> /usr/lib/perl5/site_perl/5.8.0/Bio/DB/WebDBSeqI.pm line 701
>
> So WebDBSeqI.pm is usurping STDOUT as part of its query. This probably
> explains what you're getting. Apache will redirect STDOUT straight to
> the return stream for the connection. This means it gets the output
> intended for WbDBSeq and it appears in your programs output. You then
> get the output you printed.
>
This is part of Lincoln's rechaining of the IO and using fork - looking
at his comments in the code.
# Try to create a stream using POSIX fork-and-pipe facility.
# this is a *big* win when fetching thousands of sequences from
# a web database because we can return the first entry while
# transmission is still in progress.
# Also, no need to keep sequence in memory or in a temporary file.
# If this fails (Windows, MacOS 9), we fall back to non-pipelined
# access.
You can turn this off by adding to the DB::GenBank init
my $db = new Bio::DB::GenBank(-retrievaltype => 'io_string');
-retrievaltype => 'io_string' (for in-memory holding of the sequence
before parsing)
or
-retrievaltype => 'temp' (for use of tempfiles, but I'm not 100%
this code has gotten a workout to cleanup
until the program exits which might be
a problem for mod_perl running scripts)
> If this is right, you should have some interesting error messages in
> your logs if you run your script with warnings enabled.
>
> I can't see an immediate fix for this, short of running your fetch as a
> completely detached process with a separate STDOUT, but that kind of
> defeats the point of using mod-perl. The use of a pipe from STDOUT to
> read the results of a webquery seem pretty engrained into WebQueryI.pm
> and it may not be trivial to change it.
>
> Maybe others will be able to think of a simpler work-round?
>
>
> Simon.
>
> _______________________________________________
> Bioperl-l mailing list
> Bioperl-l at portal.open-bio.org
> http://portal.open-bio.org/mailman/listinfo/bioperl-l
>
--
Jason Stajich
Duke University
jason at cgt.mc.duke.edu
More information about the Bioperl-l
mailing list