加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:32:53 所属栏目:大数据 来源:网络整理
导读:#!/bin/perl use Inline Python; $s = new Sun(); print "SUN: $sn"; $m = new Moon(); __END__ __Python__ from ephem import Sun as Sun; from ephem import Moon as Moon; 上面的代码产生: SUN: Sun "Sun" at 0x9ef6f14Can't bless non-reference value
#!/bin/perl 

use Inline Python; 

$s = new Sun(); 
print "SUN: $sn"; 
$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: $sn"; 
$m = new Moon(); 
print "Moon: $mn";

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读