#!/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中:
发布于 2014-02-10 12:46:22
正如斯拉文在评论中指出的那样,这确实是对月球、木星和土星天体的不同处理。实际上,您正在遇到Python2问题,即types和classes之间存在差异。我不能告诉你细节,但是有关于这个问题的相当的 有一点 材料。
可以说,PyEphem提供的Python包装器将主体转换为一个适当的类,Python::Inline可以处理这个类。Python包装器_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>当然,你也可以在土星和木星上使用同样的技巧。
(我已将导入语句“化简化”:不需要as或分号。)
如果您想验证月球仍然是一个特殊的身体,即使将它变成一个类,尝试使用它的特殊属性,例如libration_lat
$m->compute()
$mllat = $m->{libration_lat};
print "Moon: ${mllat}\n";
Moon: 5:50:29.6对于任何其他类型,比如太阳,都会失败。
(我在test_bodies.py包中发现了这些特殊属性,尽管我认为这些属性也是文档化的。如果你想测试土星和木星,你可以在那里找到它们。)
https://stackoverflow.com/questions/20235000
复制相似问题