微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐