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

Đoạn mã trên sản lượng:Perl của thất bại trên 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. 

Có chuyện gì vậy? Tôi đã thử điều này với nhiều đối tượng khác (ví dụ:

from ephem import Observer as Observer; 

và sau đó

$o= new Observer(); 

trong cơ thể của mã của tôi) và nó hoạt động tốt cho tất cả mọi thứ tôi đã cố gắng TRỪ Moon.

EDIT (có thể là thông tin vô dụng):

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

  • Các thói quen tính Sun, Mercury, Venus, Mars (những mà làm việc tốt) được thực hiện trong vsop87.c , function vsop87()

  • Các thói quen để tính Jupiter, Saturn, v.v. (số không hoạt động) được thực hiện trong chap95.c, hàm chap95()

  • vsop87() "trả về" một mảng gồm 6 đôi, có vẻ như là một số tọa độ hình cầu .

  • chap95() "trả về" một mảng gồm 6 đôi, có vẻ là tọa độ Descartes, tức là hình chữ nhật và KHÔNG hình cầu.

  • planpos() trong plan.c gọi một trong hai hàm ở trên, tùy thuộc vào hành tinh bạn chọn. Điều kỳ lạ là planpos() xử lý các kết quả chức năng giống nhau (loại), mặc dù chúng trả lại những điều rất khác nhau.

  • Sau planpos(), tất cả các hành tinh đều được xử lý giống nhau. planpos() là gọi bằng kế hoạch() (cũng trong plans.c), đó là lần lượt gọi bằng obj_planet() trong circum.c mà sau đó được gọi bằng obj_cir() cũng trong circum.c

  • obj_planet() và obj_cir() xác định hành tinh. Vì các hành tinh là được xử lý giống nhau sau planpos(), nên không có sự khác biệt giữa chúng.

+0

Jupiter và Saturn cũng không hoạt động, nhưng Mercury và Venus hoạt động. Ba không làm việc bằng cách nào đó đặc biệt-cased trong mã python. –

+0

Tôi cũng đã thử Mars trước đó, và nó hoạt động. Tôi không biết nếu có bất kỳ mã Python ... Tôi nghĩ rằng các công cụ Python chỉ là bindings vào một thư viện C, libastro. – barrycarter

+0

Có một số mã python keo, trên hệ thống của tôi trong '/usr/local/lib/python2.7/site-packages/ephem/__ init __. Py'. Tôi thấy việc xử lý đặc biệt cho Mặt Trăng, Sao Mộc và Sao Thổ ở đó. Bình luận nói rằng "Bây giờ chúng ta thay thế hai trong số các lớp mà chúng ta vừa tạo ra, bởi vì _libastro thực sự cung cấp các kiểu riêng biệt cho hai cơ quan." –

Trả lời

1

Nó thực sự là cách xử lý khác nhau đối với các mặt trăng, sao Mộc và sao Thổ, như được Slaven chỉ ra trong phần bình luận. Thực tế, bạn đang gặp sự cố Python 2 có sự khác biệt giữa typesclasses. Tôi không thể cung cấp cho bạn chi tiết, nhưng có quitea bit ofmaterial về chủ đề này.

Đủ để nói, rằng trình bao bọc Python do PyEphem cung cấp biến các đối tượng thành một lớp thích hợp, mà Python::Inline có thể xử lý.Trình bao bọc Python-C, _libastro, cung cấp các loại thay thế, và do đó, hãy đặt Moon thành _libastro.Moon làm cho một loại thay vì một lớp. Tại sao Python::Inline có thể xử lý các lớp học và không phải loại, tôi không biết.

Điều này, tuy nhiên, cung cấp đủ thông tin cho một công việc xung quanh: biến ephem.Moon thành một lớp học. Như vậy, sau đây có thể làm việc:

#!/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 

mà đối với tôi quả trong:

SUN: <Sun "Sun" at 0x1f450b0> 
Moon: <Moon "Moon" at 0x20eec50> 

Bạn có thể áp dụng các thủ thuật tương tự để sao Thổ và sao Mộc dĩ nhiên.

(Tôi đã "Pythonized" các báo cáo nhập khẩu một chút:. Không cần as hoặc dấu chấm phẩy)

Trong trường hợp bạn muốn xác minh rằng mặt trăng vẫn là một cơ quan đặc biệt thậm chí sau khi chuyển nó vào một lớp học, cố gắng sử dụng trên các thuộc tính đặc biệt của nó, ví dụ libration_lat:

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

Moon: 5:50:29.6 

đó sẽ thất bại cho bất kỳ loại khác như Mặt Trời

(Tôi tìm thấy những thuộc tính đặc biệt trong test_bodies.py trong gói PyEphem, mặc dù tôi đoán chúng được ghi nhận là tốt. Trong trường hợp bạn muốn thử nghiệm cho Saturn và sao Mộc, bạn có thể tìm thấy chúng ở đó.)

+0

Tuyệt vời, cảm ơn! Trong thời gian đó, tôi đã phát hiện ra Skyfield ... bây giờ, làm thế nào để sử dụng nó trong Perl, hmmm. – barrycarter

Các vấn đề liên quan