Perl的Inline :: Python在pyephem上失败了

#!/bin/perl 

use Inline Python; 

$s = new Sun(); 
print "SUN: $s\n"; 
$m = new Moon(); 

__END__ 
__Python__ 
from ephem import Sun as Sun; 
from ephem import Moon as Moon;

上面的代码产生:

SUN: <Sun "Sun" at 0x9ef6f14>
Can't bless non-reference value at /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/Inline/Python.pm line 317.

怎么了?我已经尝试过许多其他对象(例如:

from ephem import Observer as Observer;

然后

$o= new Observer();

在我的代码的正文中)它适用于我尝试过的所有事情除了月亮.

编辑(可能无用的信息):

https://github.com/brandon-rhodes/pyephem/tree/master/libastro-3.7.5

>计算太阳,水​​星,金星,火星的程序(那些
工作正常)在vsop87.c中完成,函数vsop87()
>计算木星,土星等的例程(那些
不工作)在chap95.c中完成,函数chap95()
> vsop87()“返回”一个包含6个双打的数组,这似乎是一些
一种球面坐标.
> chap95()“返回”一个6个双打的数组,看起来像是
笛卡尔坐标,即矩形和非球形.
plan.c中的planpos()调用上面两个函数之一,
取决于您选择的行星.什么是奇怪的是planpos()
功能结果视为相同(有点),即使它们也是如此
返回非常不同的东西.
>在planpos()之后,所有行星都被视为相同. planpos()是
由plans()(也在plans.c中)调用,而后者又被调用
在circum.c中的obj_planet(),然后由obj_cir()调用
circum.c
> obj_planet()和obj_cir()定义了这个星球.由于行星是
在planpos()之后处理相同,应该没有区别
它们之间.

解决方法

正如斯拉文在评论中指出的那样,这确实是对月球,木星和土星身体的不同处理.
实际上,您遇到的Python 2问题是类型和类之间存在差异.我不能给你详细信息,但关于这个问题有 quite a bit of material.

可以说,PyEphem提供的Python包装器将主体转换为适当的类,Python :: Inline可以处理它. Python-C包装器_libastro提供了类型,因此将Moon设置为_libastro.Moon使Moon成为一个类型而不是类.为什么Python :: Inline可以处理类而不是类型,我不知道.

然而,这为解决方案提供了足够的信息:将ephem.Moon变成课堂.
因此,以下可能有效:

#!/usr/bin/env perl

use Inline Python; 

$s = new Sun(); 
print "SUN: $s\n"; 
$m = new Moon(); 
print "Moon: $m\n";

__END__ 
__Python__ 
from ephem import Sun
from ephem import Moon
class Moon(Moon):
    pass

对我来说导致:

SUN: <Sun "Sun" at 0x1f450b0>
Moon: <Moon "Moon" at 0x20eec50>

当然,你可以将相同的技巧应用于土星和木星.

(我对导入语句进行了“Python化”了一下:不需要as或冒号.)

如果您想要将月亮变成一个特殊的身体,即使将它变成一个类,也要尝试使用它的特殊属性,例如libration_lat:

$m->compute()
$mllat = $m->{libration_lat};
print "Moon: ${mllat}\n";

Moon: 5:50:29.6

对于像太阳这样的任何其他类型都会失败.

(我在PyEphem包中的test_bodies.py中找到了这些特殊属性,虽然我认为这些属性也有记录.如果你想测试土星和木星,你可以在那里找到它们.)

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...