使用perl和earthexplorer

时间:2017-09-13 18:43:36

标签: json perl landsat

我目前正在与USGS的EarthExplorer合作,根据空间坐标设置Landsat场景的一些批量下载。它们提供了一个非常方便的脚本,可以在https://earthexplorer.usgs.gov/inventory/example/json-download_data-pl完成此操作,这很棒。我在集群上工作,尽管正确安装了所有perl模块,但是当我运行脚本时,我得到以下输出:

Running Script...


Error: Error: malformed JSON string, neither array, object, number, string or 
atom, at character offset 0 (before "LWP will support htt...") at ./dl.pl line 182

这似乎很好奇。作为解释的方式,脚本以

开头
#!/usr/bin/perl

#use strict;
use warnings;
use 5.010;
use JSON;
use Scalar::Util qw(looks_like_number reftype dualvar );
use LWP::UserAgent;
use Getopt::Long qw(GetOptions);

my ($username, $password);
$username = "myusername_filled_in";
$password = "mypassword_filled_in";

GetOptions(
    'username=s' => \$username,
    'password=s' => \$password,
) or die "Error retrieving Username and Password\n";

和令人讨厌的代码是

    $res = $response->{_content};
    $res = decode_json $res;

Can't run Perl script on other computer中提供了非常有用的建议后,我完成了以下工作:

  1. 在违规的代码区域中将$response->content更改为$response->decoded_content( charset => 'none')

  2. 启动lwp-request https://google.com/刚刚撤回完整的网页 - 没有错误。所以,这似乎有效。

  3. 试图通过插入print $response->decoded_content( charset => 'none');然后抛出错误来查看一些调试

  4. LWP will support https URLs if the LWP::Protocol::https module is installed.

    而且,确实安装了LWP :: Protocol :: https。

    我觉得必须有一些简单的东西我不知道 - 就像我在声明变量之后定义我的用户名和密码(只是$username = "myusername";等)或其他asinine。

    还有其他人遇到过这个吗?

    要添加以下查询的输出:

    $ which cpan ; head -n 1 `which cpan` ; echo 'o conf' | cpan | grep -P 'make|mbuild' ; set | grep ^PERL ; which perl ; perl -le'use LWP::Protocol::https; print "ok";'
    
    /share/pkg/perl/5.10.1/bin/cpan
    #!/share/pkg/perl/5.10.1/bin/perl
        make               [/usr/bin/make]
        make_arg           []
        make_install_arg   []
        make_install_make_command [/usr/bin/make]
        makepl_arg         []
        mbuild_arg         []
        mbuild_install_arg []
        mbuild_install_build_command [./Build]
        mbuildpl_arg       []
    PERL5LIB=/home/jb92b/perl5/lib/perl5:/home/jb92b/perl5/lib/perl5:/home/jb92b/perl5/lib/perl5
    PERL_LOCAL_LIB_ROOT=/home/jb92b/perl5:/home/jb92b/perl5:/home/jb92b/perl5
    PERL_MB_OPT='--install_base "/home/jb92b/perl5"'
    PERL_MM_OPT=INSTALL_BASE=/home/jb92b/perl5
    /share/pkg/perl/5.10.1/bin/perl
    ok
    

2 个答案:

答案 0 :(得分:1)

您的代码没有检查错误。你应该有像

这样的东西
$response->is_success()
   or die("Can't fetch X: ".$response->status_line());

您遇到的问题是LWP :: Protocol :: https未安装。

你声称它是,但是Perl在这里是权威的:)它没有被Perl安装,你安装了一个非标准目录而没有告诉Perl在那里寻找它,或者那里有权限问题。

在这种情况下,您的脚本使用/usr/bin/perl,但您使用/ /share/pkg/perl/5.10.1/bin/perl安装了该模块。您需要切换脚本使用的perl,或者需要使用/ /usr/bin/perl来安装模块。

答案 1 :(得分:0)

“就像我在声明变量之后定义我的用户名和密码(只是$username = "myusername";等)”

您不应修改代码以添加用户名和密码。它的编写方式,对GetOptions的调用将覆盖它们。你应该使用

program.pl --usernam myusername --password mypassword