shell - 管道 python 字符串到 perl 脚本
问题描述
我想通过管道将文件路径从 Python 传输到 Perl 脚本。虽然我熟悉 Python 和 Bash,但我对 Perl 一无所知。
我有以下(示例)文件:
返回.py
print( 'data/test.txt' )
uniprot.pl
use strict;
use warnings;
use LWP::UserAgent;
my $list = $ARGV[0]; # File containg list of UniProt identifiers.
my $base = 'http://www.uniprot.org';
my $tool = 'uploadlists';
my $contact = ''; # Please set your email address here to help us debug in case of problems.
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";
当我从 shell 调用 perl 文件时,perl uniprot.pl data/test.txt
它工作正常。
我尝试了不同的方法来将 python 打印传递给这个调用,但显然是错误的:
1.
python3 return.py | perl uniprot.pl
这将给出:Failed, got 500 Internal Server Error for http://www.uniprot.org/uploadlists/
。但是,据我所知,代码有效(如上所述),这必须是由错误的管道引起的。
2
python3 return.py | perl uniprot.pl -
这将给出:Can't open file -: No such file or directory at /usr/share/perl5/LWP/UserAgent.pm line 476.
所以似乎字符串被传递到 perl 文件,但是 perl 正在寻找一个完全不同的目录。
3
我更改了这一行:my $list = $ARGV[0];
--to--> my $list = <STDIN>;
,然后再次调用上述两个命令(因此是 1 和 2)。两者都给出:Can't open file data/test.txt
: No such file or directory at /usr/share/perl5/LWP/UserAgent.pm line 476.
问题
如何将字符串从return.py
to传递uniprot.pl
?
解决方案
您需要检查参数是通过命令行参数给出还是通过 STDIN 提供。
my $file;
if (@ARGV) {
$file = $ARGV[0];
}
else {
chomp($file = <STDIN>); # chomp removes linebreak
}
推荐阅读
- php - 获取选定的文本
- javascript - 为什么我不能删除类名为 building-x 的附加元素?
- c++ - 在 c/c++ 中查找网络吞吐量
- c# - VSTS 构建 Specflow 错误已安装 3.0 但它正在尝试使用 1.9
- django - 如何将详细视图的pk传递给表单的fk
- vba - 根据项目在整个订单总计中的份额分配订单在订单项目上的运费成本值
- sql-server - SQL Server:根据参数输入创建动态表
- java - 仅当用户登录时如何执行此代码
- javascript - 如何每'x'小时向Slack发送消息?
- vue.js - 如何在 Vue CLI 环境中使用 oAuth2 正确验证和使用 GoogleCalendar-API