5
#!/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() 调用,然后在circum.c 中也由obj_cir() 调用

  • obj_planet() 和 obj_cir() 定义行星。由于在 planpos() 之后行星的处理方式相同,因此它们之间应该没有区别。

4

1 回答 1

0

正如 Slaven 在评论中指出的那样,这确实是对月球、木星和土星体的不同处理。实际上,您遇到了 Python 2 问题,即types和之间存在差异classes。我不能给你细节,但是关于这个主题有相当 多的 材料

可以说,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>

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

(我已经“Pythonized”了一些导入语句:不需要as分号或分号。)

如果您想验证月球在变成一个类之后仍然是一个特殊的物体,请尝试使用它的特殊属性,例如libration_lat

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

Moon: 5:50:29.6

这对于任何其他类型(例如 Sun)都将失败。

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

于 2014-02-10T12:46:22.750 回答