2011-08-24 32 views
8

Ban đầu tôi có tất cả các mô-đun của mình trong một gói. Gần đây tôi đã tạo một gói phụ trong gói ban đầu và đã chuyển một vài mô-đun vào đó. Thư mục src của tôi và 2 thư mục gói, đều nằm trong PYTHONPATH của tôi.

Vì tôi đã định vị lại các mô-đun này, những thay đổi mà tôi đang thực hiện đối với các tệp .py của chúng dường như không tạo ra các tệp * $ py.class được tạo, mà tôi tin là cuối cùng trên những gì print __FILE__ phun ra.

Tệp .class nằm trong thư mục của gói cấp cao nhất, điều tôi tin là vì địa điểm đầu tiên được nhập từ bên trong mô-đun nằm trong gói đó. Vì vậy, tôi nghĩ rằng họ đang ở đúng nơi.

Di chuyển các mô-đun trở lại gói cấp cao nhất làm cho vấn đề biến mất, nhưng buộc phải có tất cả các mô-đun trong một gói không phải là giải pháp. Có điều gì tôi phải làm để 'đăng ký' một mô-đun như là một phần của một gói, ngoài việc có nó trong một thư mục với một số __init__.py?

Lưu ý: Phần còn lại của câu hỏi này chỉ là các triệu chứng khiến tôi kết luận rằng các tệp .class không được cập nhật khi tôi thay đổi tệp .py. Bạn có thể bỏ qua nó nếu bạn là một tl; dr loại người: P

Tôi đặt một khoảng trắng ở đầu hàm và khi tôi duyệt qua, con trỏ sẽ theo sau mã được sử dụng được.

Đây là mã IDE cho tôi thấy:

enter image description here

và đây là những vars địa phương (lưu ý rằng self đã không có gì ràng buộc):

enter image description here

Sau khi tôi bước một một vài dòng, đây là mã (lưu ý vị trí con trỏ): enter image description here và các địa phương:

enter image description here

Chú ý rằng tại self được ghé thăm idupdatePeriod ràng buộc, do đó, những 2 dòng đầu tiên của mã sau khi khoảng trắng đã rõ ràng được thực thi.

Nếu tôi loại bỏ tệp .py hoàn toàn (dính nó trên màn hình hoặc thứ gì đó), thì rõ ràng IDE không thể tìm thấy nó, vì vậy tôi không thể thực hiện được, nhưng chương trình chạy dựa trên mã được sử dụng được (có một số thay đổi rõ ràng mà tôi có thể nói là không có hiệu lực).

Cuối cùng, ngày sửa đổi trên file py.class * $ liên quan là khoảng 4,5 giờ cũ, mặc dù tất cả không quan trọng này, tôi đã làm với các file py gần đây trong giờ cuối cùng hoặc 2.

Trả lời

4

Các tệp Python được biên dịch không tự động bị xóa, khi .py bị xóa. Vì chúng nằm trong $PYTHONPATH trước khi các gói con của bạn, chúng được thực hiện và vì không có .py tương ứng với chúng, chúng sẽ được sử dụng và chúng sẽ không bao giờ được cập nhật. Giải pháp duy nhất là xóa thủ công chúng.

PyDev rõ ràng làm tăng thêm sự nhầm lẫn, bằng cách thực sự giải thích nguồn.

+0

Hmm. Tôi đã thử loại bỏ các tập tin lớp học có liên quan trước đó, nhưng tôi chỉ có lỗi về việc không thể tìm thấy mọi thứ. Tôi chỉ cố gắng loại bỏ * tất cả * của các tập tin lớp, và điều đó dường như sửa chữa nó. Cảm ơn! –

1

Tôi nghĩ có 2 vấn đề ở đây:

  • Khi bạn di chuyển các tập tin, các $py.class không tái sinh:

Đây có lẽ là bởi vì bạn đang chạy các tập tin như mục chính ... Nếu tôi nhớ chính xác, thì $py.class chỉ được tạo khi tệp được nhập (ví dụ: không dành cho mô-đun __main__) và chỉ khi mã thực sự được thay đổi (tôi không chắc cách Jython quyết định nó đã được thay đổi như thế nào - có lẽ là thời gian của tập tin, nhưng tôi có thể sai ở đây).

Giải pháp tốt nhất cho việc đó là xóa $ py.class khi bạn di chuyển tệp và $ py.class tương ứng (như di chuyển thư mục), theo cách đó bạn có thể chắc chắn là Jython chắc chắn sẽ không bao giờ nhặt nó lên .

PyDev có thể giúp bạn ở đó: chọn thư mục trong PyDev Package Explorer > PyDev > Remove *.pyc, *.pyo and *$py.class Files.

  • $py.class tập tin mà không file py tương ứng

PyDev thực sự xử lý này đúng cho các tập tin pyc (nghĩa là .: xóa pyc khi file py không còn có sẵn). Tôi đang thay đổi PyDev để xử lý nó cho các tệp $py.class (vì vậy, nếu bạn nhận được hàng đêm trong vòng 3-4 giờ, nó sẽ hoạt động - xem: http://pydev.org/download.html để được hướng dẫn - cho đến lúc đó, bạn có thể xóa bằng tay như mô tả ở trên).

+0

Trên thực tế không, các tệp tôi đã chuyển tất cả đều được nhập từ nơi khác. Không ai trong số họ là mục nhập chính. Tôi nghĩ rằng @vartec là đúng trong đó các tập tin lớp học cũ ngồi trong gói cấp cao nhất đã được gặp phải đầu tiên, và do đó đang được sử dụng, thay vì tìm kiếm sâu hơn và tìm các tập tin nguồn phải được biên dịch lại. Mẹo Package Explorer rất hữu ích, cảm ơn! Và thật tuyệt khi biết rằng bản sửa lỗi đang được tiến hành trong lần xây dựng tiếp theo :) –

1

Tôi có cùng một câu hỏi ở đây và tôi đã thực hiện một vài thử nghiệm.
Tôi biết chủ đề này là cũ, nhưng tôi vẫn muốn thêm một cái gì đó ở đây.

Chỉ các tệp $py.class được tạo và cập nhật khi .py class đang được nhập ở đâu đó. Nếu tệp .py đang được thực thi với execfile() thì tệp $py.class không phải là được tạo hoặc cập nhật.

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