【问题标题】:How to run a local program with user input in Perl如何在 Perl 中使用用户输入运行本地程序
【发布时间】:2014-05-24 13:43:45
【问题描述】:

我正在尝试从用 Perl 编写的网页获取用户输入并将其发送到本地程序 (blastp),然后显示结果。

这就是我现在拥有的:

(input code)

print $q->p, "Your database: $bd",
$q->p, "Your protein is: $prot",
$q->p, "Executing...";

print $q->p, system("blastp","-db $bd","-query $prot","-out results.out");

现在,我做了一些研究,但我不能完全理解你应该如何在 Perl 中做这样的事情。我尝试打开一个文件,写入文件,然后将其作为输入发送到 blastp,但没有成功。

作为参考,这一行产生一个成功的输出文件:

 kold@sazabi ~/BLAST/pataa $ blastp -db pataa -query ../teste.fs -out results.out

我可能需要强制 bd 从绝对路径加载,但这应该不难。

edit:是的,数据库有一个环境变量,这是固定的。好的,我所需要的只是将输入放入文件中,将其传递给命令,然后将输出文件打印到 CGI 页面。

edit2:澄清:

我在 $prot 中接收用户输入,我想将它传递给 blastp in -query,让程序 blastp 执行,然后将 results.out 文件打印给用户(或者只是有一个链接,因为blastp可以输出HTML)

编辑:

好的,修复了我需要修复的所有内容。最大的问题是我没有发现问题所在:我必须安装 Tiny:Capture 并打印出 stderr,这时我意识到环境变量设置不正确,因此 BLAST 没有找到我的数据库。感谢大家的帮助!

【问题讨论】:

  • 我不明白你想要什么,解释更多
  • 添加了更多细节。
  • $prot 会包含文件名还是内容?
  • 现在,我正计划使用 $prot 接收 FASTA 文本,即看起来像这样的内容:>gi|218093591|emb|CAT70956.1| unnamed protein product [Thermococcus kodakarensis KOD1] MKVLVAAPLHEKAIEVLKNAGFEVVYEEYPDEDRLVELVKDVDAIIVRSKPKVTRKVIEAAPKLKVIGRA GVGLDNIDLKAAEERGIKVVNSPGASSRSVAELAIGLIFAVARKIAFADRKMREGVWAKKQCMGIELEGK TIGVVGFGRIGYQVAKIANALGMKVLFYDPYPNEERAKEVGGKFADLETLLKESDVVTLHVPLVDATYHL INEERLKLMKPTAILINAARGAVVDTDALVKALQEGWIAGAGLDVFEEEPLPADHPLTKLDNVVLTPHIG ASTVEAQMRAGVEVAEKIVEALKG

标签: perl cgi


【解决方案1】:
  1. $prot 写入文件。假设您需要按原样执行此操作,而不需要处理文本以将其拆分或其他内容:

    • 对于一个固定的文件名(可能有问题):

      use File::Slurp;
      write_file("../teste.fs", $prot, "\n") or print_error_to_web(); 
            # Implement the latter to print error in nice HTML format
      
    • 对于临时文件(更好):

      my ($fh, $filename) = tempfile( $template, DIR => "..", CLEANUP => 1);
      # You can also create temp directory which is even better, via tempdir()
      print $fh "$prot\n";
      close $fh;
      
  2. 第 2 步:按照您的指示运行命令:

    my $rc = system("$BLASTP_PATH/blastp", "-db", "pataa"
                    ,"-query", "../teste.fs", "-out", "results.out");
    # Process $rc for errors
    # Use qx[] instead of system() if you want to capture 
    #      standard output of the command
    
  3. 第三步:读取输出文件:

    use File::Slurp;
    my $out_file_text = read_file("results.out");
    
  4. 发送回网络服务器

    print $q->p, $out_file_text;
    

上面的代码有多个问题(例如,您需要更好的文件/目录路径、更多的错误处理等...)但应该让您走上正轨。

【讨论】:

  • 谢谢,这对您有很大帮助。但是,仍然存在一个问题:显然我需要保留换行符并且 write_file 没有正确执行。我的输入文件,以及我对 $prot 所做的测试打印,在第一位之后显示一个换行符,就像我在那里编写的注释一样,但是 write_file 生成的文件将所有内容都放在一行中,使 BLAST 无法识别它。
  • @JoséMaia - 这正是我说“假设您需要按原样执行它而不处理文本来拆分它或其他东西”的原因。如果您需要知道如何操作,请查看split
  • 好的,解决了问题,代码现在生成了一个正确的 input.fs 文件,以及一个正确的 (blastp -db pataa -query input.fs -out results.out) 查询。然而,results.out 文件是空的,尽管如果我在终端中手动执行查询,它仍然有效。有没有我应该查看日志以了解发生了什么的地方?
  • 也不认为是权限问题,看我进入 www-data 并执行代码,就可以了。
猜你喜欢
  • 2010-11-24
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 2014-08-08
相关资源
最近更新 更多