#!/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中找到了这些特殊属性,虽然我认为这些属性也有记录.如果你想测试土星和木星,你可以在那里找到它们.)