如何在Perl中使用(或转换或查看)内联Python对象?

时间:2016-06-21 07:18:40

标签: python perl

我复活了一些孤立的代码,这是用Perl编写的,但是使用内联Python。对Python模块的调用返回一个dicts或Python对象的数组。我真的在如何访问数据结构中苦苦挣扎 - 如果我尝试直接记录(打印)数据结构,它似乎可以提供数据,但是如果我索引顶级数组(或迭代)在列表中)它告诉我它不是数组引用。如果我尝试在我得到的对象上使用Dumper:

$VAR1 = bless( do{\(my $o = '140162464462376')}, 'Inline::Python::Object' );

我可以使用(或转换)此对象的任何想法吗?

编辑:示例代码如下。这需要一个谷歌音乐帐户,安装gmusicapi python模块(对于他们的python方面;显然是perl方面的内联python)。有趣的是,我编写了一些python代码,只将API调用返回的数据结构转储到Inline Python部分 - 它运行正常(参见https://gist.github.com/askvictor/119c24b6fc46a77b349b307457e1a027)。当我实际将API调用放入Inline Python部分时,它会在第4行与Not an ARRAY reference at sample.pl line 4.

分开
use strict;
use warnings;

my $data = search("radiohead");
print "$data\n";
print "$data->{song_hits}\n";
print "$data->{song_hits}[0]\n";
for my $hit (@{$data->{song_hits}}){
    print "$hit->{track}->{title}\n";
}

use Inline Python => <<'END_OF_PYTHON_CODE';
import gmusicapi

USERNAME="my_username@gmail.com"
PASSWORD="sooper_secr3t"
DEVICE_ID = "12345abcde123" # this can be obtained using https://raw.githubusercontent.com/squeezebox-googlemusic/squeezebox-googlemusic/master/mobile_devices.py
def search(needle):
    c = gmusicapi.Mobileclient()
    c.login(USERNAME, PASSWORD, DEVICE_ID)
    r = c.search(needle, 2)
    return r
END_OF_PYTHON_CODE

1 个答案:

答案 0 :(得分:1)

我通过一个无用的&#39;列表理解py_eval()。似乎Perl的内联Python不处理从python代码返回的类型future.types.newlist.newlist的列表。因此,这些代码将这些代码转换为普通的旧列表,然后Perl可以处理它们。

my $song_hits = py_eval("[x for x in $data->{song_hits}]", 0);
for my $hit (@$song_hits) {
    print $hit->{track}->{title};
    print "\n";
}