如何将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
相关产品推荐
相关产品推荐

