2013-11-27 32 views
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; 

失敗以上產量的代碼:Perl的內嵌:: Python的上pyephem

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(); 
在我的代碼的身體

)並能正常工作的一切我已經試過除非月球。

EDIT(可能是無用的信息):

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

  • 計算太陽,水​​星,金星,火星(那些 是做工精細)的程序在做vsop87.c ,函數vsop87()

  • 用於計算木星,土星等( 不工作的那些)的例程在chap95.c中完成,函數chap95()

  • vsop87()「返回」一個包含6個雙打的數組,這似乎是某種球面座標的一些 。 chap95()「返回」一個包含6個雙精度的數組,它看起來像是 直角座標,即矩形和非球形。

  • plans.c中的planpos()調用上述兩個函數之一, ,具體取決於您選擇的星球。奇怪的是,planpos() 將函數結果視爲相同(排序),即使它們 返回完全不同的東西。

  • 在planpos()之後,所有的行星都被視爲一樣。 planpos()是 由計劃()(也在plans.c),它依次由 obj_planet()在調用circum.c稱爲然後由obj_cir稱爲(也)在 circum.c

  • obj_planet()和obj_cir()定義了這個星球。由於在planpos()後對行星 的處理方式相同,因此它們之間應該沒有差別 。

+0

木星而土星也不行,但水星和金星的工作。這三種非工作方式在python代碼中是特殊的。 –

+0

我也嘗試過火星,它的工作原理。我不知道是否有任何Python代碼...我認爲Python的東西只是綁定到C庫libastro。 – barrycarter

+0

在我的'/usr/local/lib/python2.7/site-packages/ephem/__ init __。py'系統中有一些粘連python代碼。我在那裏看到月球,木星和土星的特殊處理。評論說:「我們現在替換我們剛剛創建的兩個類,因爲_libastro實際上爲兩個主體提供了不同的類型。」 –

回答

1

正如斯拉文在評論中指出的那樣,它確實是月球,木星和土星體的不同處理。 事實上,你遇到了Python 2問題,typesclasses之間有區別。我不能給你詳細的信息,但是關於這個問題有quitea bit ofmaterial

可以這麼說,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」 import語句了一下:無需as或分號)

如果你想驗證月球仍然是一個特殊的身體甚至轉向後它變成一個類,嘗試在它的特殊屬性的使用,例如libration_lat

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

Moon: 5:50:29.6 

這會爲任何其他類型的故障,如太陽。

(我在PyEphem包test_bodies.py發現這些特殊的屬性,但我相信這些都記錄爲好。如果你想測試土星和木星,你可以在那裏找到他們。)

+0

太棒了,謝謝!在此期間,我發現了Skyfield ......現在,如何在Perl中使用它,嗯。 – barrycarter