You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python输出的文件路径传递给Perl脚本?

解决Python输出路径传递给Perl脚本的问题

我来帮你搞定这个问题!核心问题在于你之前用管道传递的方式不符合Perl脚本的参数读取逻辑,下面给你两种可行的解决方案:

方案1:用命令替换直接传递路径(最简单)

不需要修改任何脚本,直接用命令替换把Python的输出作为Perl脚本的命令行参数:

perl uniprot.pl $(python3 return.py)

或者用反引号写法(效果完全一致):

perl uniprot.pl `python3 return.py`

这个方式和你手动输入perl uniprot.pl data/test.txt完全等价,Python输出的路径会被直接作为Perl脚本的第一个命令行参数,脚本就能正常读取指定文件并上传了。

方案2:修改Perl脚本支持管道输入

如果你一定要用管道传递路径,需要修改uniprot.pl的参数读取逻辑,重点是要去掉输入路径末尾的换行符(因为Python的print会自动添加换行):

use strict; use warnings; use LWP::UserAgent;

# 从标准输入读取路径并去掉末尾的换行符
chomp(my $list = <STDIN>); 

my $base = 'http://www.uniprot.org';
my $tool = 'uploadlists';
my $contact = ''; # 请设置你的邮箱地址,方便UniProt团队调试问题
my $agent = LWP::UserAgent->new(agent => "libwww-perl $contact");
push @{$agent->requests_redirectable}, 'POST';

my $response = $agent->post("$base/$tool/",
    [
        'file' => [$list],
        'format' => 'fasta',
        'from' => 'ACC+ID',
        'to' => 'ACC',
    ],
    'Content_Type' => 'form-data'
);

while (my $wait = $response->header('Retry-After')) {
    print STDERR "Waiting ($wait)...\n";
    sleep $wait;
    $response = $agent->get($response->base);
}

$response->is_success ? print $response->content : die 'Failed, got ' . $response->status_line . ' for ' . $response->request->uri . "\n";

修改后运行管道命令即可正常工作:

python3 return.py | perl uniprot.pl

为什么之前的尝试失败?

  • 第一种管道方式python3 return.py | perl uniprot.pl:Perl脚本的$ARGV[0]是空的,因为管道内容会进入Perl的标准输入,而不是命令行参数,导致脚本上传空文件引发500错误。
  • 第二种方式python3 return.py | perl uniprot.pl -:脚本把-当成文件名去打开,但LWP::UserAgent不会把-解析为标准输入,而是直接尝试打开名为-的文件,所以报错找不到文件。
  • 修改为my $list = <STDIN>;但没加chomp:读取到的路径末尾带有换行符,变成了data/test.txt\n,系统找不到这个带换行的文件路径,因此报错。

内容的提问来源于stack exchange,提问作者CodeNoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:41:13