首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl的内联::Python在pyephem上失败

Perl的内联::Python在pyephem上失败
EN

Stack Overflow用户
提问于 2013-11-27 05:59:24
回答 1查看 322关注 0票数 5
代码语言:javascript
运行
复制
#!/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; 

上面的代码产生:

代码语言:javascript
运行
复制
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.

怎么了?我试过很多其他的东西(如:

代码语言:javascript
运行
复制
from ephem import Observer as Observer;

然后

代码语言:javascript
运行
复制
$o= new Observer();

(在我的代码中),它对我尝试过的每件事都很好,除了穆恩。

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

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

  • 计算太阳、水星、金星、火星的例程(这些程序工作得很好)是在vsop87 87.c函数vsop87()中完成的。
  • 计算木星、土星等(不起作用的程序)的例程在第95.c章,函数chap95()中完成
  • vsop87()“返回”一个6倍的数组,它似乎是某种球面坐标。
  • chap95()“返回”一个6倍的数组,它看起来是笛卡尔坐标,即矩形而不是球形。
  • 在plans.c中,planpos()调用上述两个函数之一,这取决于您选择的行星。奇怪的是,planpos()将函数结果处理为相同(某种程度),尽管它们返回的内容非常不同。
  • 在行星()之后,所有的行星都被同等对待。planpos()是由plan()调用的(也在plans.c中),而obj_planet()又调用了car.c中的planpos(),然后由obj_cir()调用
  • obj_planet()和obj_cir()定义了行星。由于行星在行星()之后被同等对待,它们之间应该没有区别。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-10 12:46:22

正如斯拉文在评论中指出的那样,这确实是对月球、木星和土星天体的不同处理。实际上,您正在遇到Python2问题,即typesclasses之间存在差异。我不能告诉你细节,但是有关于这个问题的相当的 有一点 材料

可以说,PyEphem提供的Python包装器将主体转换为一个适当的类,Python::Inline可以处理这个类。Python包装器_libastro提供类型,因此将Moon设置为_libastro.Moon使Moon成为一个类型而不是一个类。我不知道为什么Python::Inline可以处理类而不是类型。

然而,这为工作提供了足够的信息:将ephem.Moon转换为类。因此,以下几点可能有效:

代码语言:javascript
运行
复制
#!/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

对我来说,结果是:

代码语言:javascript
运行
复制
SUN: <Sun "Sun" at 0x1f450b0>
Moon: <Moon "Moon" at 0x20eec50>

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

(我已将导入语句“化简化”:不需要as或分号。)

如果您想验证月球仍然是一个特殊的身体,即使将它变成一个类,尝试使用它的特殊属性,例如libration_lat

代码语言:javascript
运行
复制
$m->compute()
$mllat = $m->{libration_lat};
print "Moon: ${mllat}\n";

Moon: 5:50:29.6

对于任何其他类型,比如太阳,都会失败。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20235000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档