J'essaie d'exécuter bp_genbank2gff3.pl
(paquet bioperl) à partir d'un autre script perl que obtient un genbank comme argument.Problème avec le handle de fichier canalisé en perl
Cela ne fonctionne pas (pas de fichiers de sortie sont générés):
my $command = "bp_genbank2gff3.pl -y -o /tmp $ARGV[0]";
open(my $command_out, "-|", $command);
close $command_out;
mais cela ne
open(my $command_out, "-|", $command);
sleep 3; # why do I need to sleep?
close $command_out;
Pourquoi?
Je pensais que close
est censé bloquer jusqu'à ce que la commande se fait:
La fermeture d'un descripteur de fichier provoque canalisé le processus parent d'attendre l'enfant pour terminer ... (voir http://perldoc.perl.org/functions/open.html).
Modifier
J'ajouté ce dernier en ligne:
say "ret=$ret, \$?=$?, \$!=$!";
et dans les deux cas, l'impression est:
ret=, $?=13, $!=
(ce qui signifie close
a échoué dans les deux cas , à droite?)
Quelle est la valeur de retour de 'close()'? Qu'est-ce que "$?" Et peut-être "$!"? Est-ce que 'bp_genbank2gff3.pl', ou l'expansion shell de' $ ARGV [0] 'fork et exit? Que dit «Strace» ou «Truss»? Êtes-vous sûr que les fichiers de sortie dans le cas de "travail" ne sont pas laissés par un travail non lié et réussi? Pouvez-vous reproduire le comportement problématique avec un utilitaire shell communément disponible, plutôt que 'bp _... 3.pl'? – pilcrow
@pilcrow voir éditer. 'strace' renvoie une très longue liste, que dois-je rechercher? Je suis sûr que la sortie n'est pas un résidu quand 'sleep' est activé (je supprime tout le contenu du répertoire avant de l'exécuter). Je n'ai pas compris votre question sur la fourche. BTW: http://github.com/bioperl/bioperl-live/blob/master/scripts/Bio-DB-GFF/genbank2gff3.PLS –
'strace -fe trace = processus mon_perl_script' devrait vous aider à démarrer. Cependant, @mobrule l'a trouvé à partir de $? – pilcrow