2009-11-05 27 views
12

Tôi biết đó là điều ngớ ngẩn, nhưng vì lý do nào đó, Jython từ chối tìm javax.swing. Tôi đang sử dụng Java 1.6.0_11. Đây là khởi động kịch bản của tôi:Tại sao Jython từ chối tìm gói Java của tôi?

@echo off 

"%JAVA_HOME%\bin\java" -Xmx1024M -classpath ".;c:\Projects\Jython2.5.1\jython.jar" org.python.util.jython 

đầu ra của tôi trông giống như:

Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54) 
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_10 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import javax.swing 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named swing 
>>> import javax 
>>> dir(javax) 
['__name__'] 
>>> 
+3

Đây là câu hỏi/vấn đề rất phổ biến. Bất kỳ cơ hội nào bạn sẽ thay đổi tiêu đề thành "Tại sao Jython từ chối tìm gói Java của tôi?" theo cách đó nhiều người có thể sẽ tìm thấy điều này. –

+0

Tôi đã đổi tên - bạn nói đúng, điều này có thể xảy ra với bất kỳ ai. – MikeHoss

+0

Cảm ơn bạn đã đổi tên! –

Trả lời

12

Rất có thể Jython không quét gói của bạn. Khi khởi động, Jython cố gắng đi qua các tệp tin jars và lớp trên đường dẫn của nó và quét các gói Java. Điều này là cần thiết vì không có cách nào tìm kiếm các gói Java bằng cách phản ánh. Quét gói có thể được cố ý tắt, hoặc bạn có thể thiếu các đặc quyền ghi khi muốn ghi thông tin được lưu trong bộ nhớ cache ra để xem thêm http://wiki.python.org/jython/PackageScanning để biết thêm. Cách tốt nhất để nhập khẩu các lớp Java là làm như vậy một cách rõ ràng lớp bằng lớp, như vậy:

from javax.swing import JFrame 

Phương pháp này nên luôn luôn làm việc, ngay cả khi quét gói tắt hoặc không có khả năng làm việc, và là phương pháp được đề xuất (mặc dù nó có thể là một chút tẻ nhạt). Nếu bạn muốn nhập các gói (hoặc nếu bạn muốn làm "từ nhập javax.swing *" cũng phụ thuộc vào quét gói - nhưng không được khuyến khích), bạn sẽ cần phải tìm ra lý do quét gói của bạn không hoạt động.

+0

Điều "từ đối tượng nhập gói" đã hoạt động. Tôi sẽ tìm ra lý do tại sao các gói quét không hoạt động nhưng ít nhất tôi có một cái gì đó để đi về. Cảm ơn Frank! Kịp các công việc tuyệt vời! – MikeHoss

1

Tôi đang sử dụng Java 1.6.0_11

Không, bạn đang sử dụng

[Java HotSpot (TM) Máy khách khách hàng (Sun Microsystems Inc.)] trên java1.6.0_10

Điều gì sẽ xảy ra nếu bạn xóa bộ đệm ẩn khỏi thư mục phân phối Jython và thử lại?

Ngoài ra, tại sao bạn đặt rõ ràng classpath theo cách đó? Tại sao không chỉ đơn giản là

java -jar jython.jar 

?

+0

Tôi đang sử dụng jar Jython độc lập, không làm bộ nhớ đệm. Và tôi không thể chạy nó từ -jar vì cuối cùng tôi sẽ bắt đầu thêm các lọ khác vào classpath. – MikeHoss

+0

bạn có thể bật bộ nhớ đệm ngay cả khi sử dụng bình độc lập. Xem câu trả lời của tôi trong chủ đề này. – Mikeyg36

11

Tôi đã gặp sự cố tương tự và chỉ ra rằng vì không có bộ đệm Jython độc lập hỗ trợ bộ nhớ đệm, nó cũng không hỗ trợ phương pháp "nhập *". này không được ghi lại rõ ràng bất cứ nơi nào trong tài liệu chính thức Jython, nhưng tôi đã kết luận này dựa trên một số báo cáo lỗi khác nhau:

Đáng chú ý từ liên kết sau cùng:

Vì vậy, như Oti lưu ý, trong độc lập, bạn phải nhập khẩu đầy đủ để thành công.

Để khắc phục sự cố của bạn, sử dụng jython không độc lập.jar được tạo bằng cách cài đặt jython bằng cách sử dụng tùy chọn 'Chuẩn'.

Nếu bạn muốn đóng gói và phân phối jython.jar với ứng dụng của bạn, trong trường hợp người dùng không cài đặt Jython, bạn cũng cần copy/pase thư mục "Lib" hoàn chỉnh từ thư mục cài đặt jython vào vị trí bạn kết thúc đặt jython.jar. Điều này cho phép truy cập vào stdlib python không được bao gồm trong tệp jar chuẩn.

CẬP NHẬT: Sau khi phát xung quanh nhiều hơn, tôi nghĩ mình có thể khắc phục để nhập nhập "nhập *" ngay cả khi sử dụng bình độc lập. Tất cả những gì cần phải làm là kích hoạt bộ nhớ đệm!

Bạn có thể làm việc này bằng cách bổ sung thêm các tùy chọn sau đây để JVM khi chạy Jython:

-Dpython.cachedir.skip = sai -Dpython.cachedir = MONG MUỐN CACHE PATH

(Lưu ý rằng đối số thứ hai là tùy chọn và nếu để trống, giá trị mặc định sẽ được sử dụng)

Nếu bạn gặp sự cố khi chạy InteractiveConsole được nhúng trong ứng dụng (đó là w mũ vấn đề của tôi là), bạn có thể thêm các thuộc tính này trước khi khởi chạy bảng điều khiển:

Properties props = new Properties(); 
    props.put("python.cachedir.skip", "false"); 
    props.put("python.cachedir", "DESIRED CACHE PATH"); // again, this option is optional 
    InteractiveConsole.initialize(System.getProperties(), props, new String[0]); 
+0

Có cách nào để sửa đổi jar độc lập sao cho python.cachedir.skip được đặt thành false theo mặc định? – Kyle

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