Perl的Inline :: Python在pyephem上失败了
#!/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: >计算太阳,水??星,金星,火星的程序(那些 解决方法
正如斯拉文在评论中指出的那样,这确实是对月球,木星和土星身体的不同处理.
实际上,您遇到的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中找到了这些特殊属性,虽然我认为这些属性也有记录.如果你想测试土星和木星,你可以在那里找到它们.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |