Perl的Inline::Python执行pyephem失败

2024-09-29 22:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

#!/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; 

上面的代码生成:

^{pr2}$

怎么了?我尝试过很多其他物体(例如:

from ephem import Observer as Observer;

然后呢

$o= new Observer();

在我的代码体中),它对我所尝试过的一切都很好,除了月亮。在

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

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

  • 计算太阳,水星,金星,火星的程序

  • 计算木星、土星等的程序 不工作)在chap95.c中完成,函数chap95()

  • vsop87()返回一个由6个双精度数组组成的数组 一种球坐标。

  • chap95()“返回”一个6个双精度数组,看起来 笛卡尔坐标,即矩形而非球面。

  • plans.c中的planpos()调用上述两个函数之一, 取决于你选择哪个星球。奇怪的是planpos() 将函数结果视为相同的(某种程度上),即使它们 返回完全不同的东西。

  • 在planpos()之后,所有的行星都是一样的。planpos()是 由plans()调用(也在plans.c中),它又由调用 循环c中的obj_planet(),然后由obj_cir()在 环c

  • obj_planet()和obj_cir()定义行星。因为行星 在planpos()之后处理相同,应该没有区别 他们之间。


Tags: 函数fromimportobjnewas数组行星
1条回答
网友
1楼 · 发布于 2024-09-29 22:29:14

正如斯莱文在评论中指出的,这确实是对月球、木星和土星的不同处理方式。 实际上,您遇到了Python2问题,types和{}之间有区别。我不能告诉你详细情况,但这个问题有quitea bit ofmaterial。在

可以说,PyEphem提供的Python包装器将主体转换为一个适当的类,Python::Inline可以处理这个类。Python-C包装器_libastro提供了类型,因此将Moon设置为_libastro.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

对我来说,结果是:

^{pr2}$

当然,你也可以对土星和木星使用同样的技巧。在

(我对import语句进行了一点“Pythonized”:不需要as或分号)

如果您想验证月球仍然是一个特殊的实体,即使在将其转换为一个类之后,请尝试使用它的特殊属性,例如libration_lat

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

Moon: 5:50:29.6

这对其他类型的太阳来说都是失败的。在

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

相关问题 更多 >

    热门问题