Tại sao py và không pyc hay pyo?


8

Khi tôi cài đặt gói gỡ lỗi python, giả sử python-numpycác tệp là tệp python đơn giản. Làm thế nào để tôi nói với người quản lý gói - rằng tôi thực sự muốn sử dụng pyc hoặc thậm chí tốt hơn - các tệp pyo?

Câu trả lời:


12

Bạn đã có chúng và bạn đã sử dụng chúng

Các ứng dụng Python được đóng gói tốt đang được biên dịch thành .pyccác tệp trong tập lệnh chạy sau khi cài đặt các tệp đã diễn ra. Điều này là cần thiết theo các hướng dẫn đóng gói để có thể chấp nhận cài đặt Python mà bạn đang sử dụng tại thời điểm đó. Hãy nhớ rằng .pyccác tệp rất cụ thể cho hệ thống của bạn (phiên bản Python và các phụ thuộc).

Do đó .pyo, tất cả và .pyccác tệp được loại trừ cụ thể trong các gói và được Lintian gắn thẻ là lỗi :

Các tập tin nguồn python biên dịch không được bao gồm trong gói. Những tập tin này nên được gỡ bỏ khỏi gói và được tạo tại thời điểm cài đặt gói trong postinst.

Tham khảo Chính sách Python của Debian phần 2.6 ( Mô-đun Byte-Compilation ) để biết chi tiết.

Mức độ nghiêm trọng: nghiêm trọng, chắc chắn: nhất định

Trong trường hợp python-numpybiên dịch byte sau khi cài đặt này được xử lý bởi hook gỡ lỗi của pycentral. Sau khi cài đặt, nó trông như thế này:

ls -l /usr/lib/python2.7/dist-packages/numpy
lrwxrwxrwx  1 root root     47 Mar 20  2012 add_newdocs.py -> ../../../../share/pyshared/numpy/add_newdocs.py
-rw-r--r--  1 root root 251912 Aug  6 22:06 add_newdocs.pyc

Một số thông tin cơ bản

Lý do tại sao những .pyc/ .pyotệp này không được biên dịch trong thời gian chạy trong lần khởi động ứng dụng đầu tiên như bạn mong đợi là như sau.

Các tệp Python được cài đặt trong một thư mục toàn hệ thống, có sẵn cho tất cả người dùng trên hệ thống. Bất cứ khi nào người dùng khởi động ứng dụng, trình thông dịch Python có thể đọc các .pytệp, nhưng nó không thể ghi vào các thư mục (ví dụ /usr/lib/python2.7/dist-packages/). Đây là một phần của bảo mật chung trong tất cả các hệ thống Linux; Người dùng không nên viết thư /usr, chỉ với quyền root, điều này là có thể. Vì lý do này, các móc APT sẽ biên dịch các tệp Python cho bạn khi cài đặt; trước hết là để giảm thiểu kích thước gói, thứ hai là có thể sắp xếp lại các hook một khi có gì đó thay đổi trên hệ thống của bạn về Python, vì nó bắt buộc phải biên dịch lại khi chúng không tương thích trong quá trình nâng cấp.

Tuy nhiên, điều này sẽ không ảnh hưởng đến các tệp python do người dùng sở hữu thường xuyên được biên dịch trong thời gian chạy.


Vì vậy, tôi nên /usr/share/pyshared/ghi lại cho chính mình - để cho phép python biên dịch các tệp trong lần chạy đầu tiên.
Adobe

4
@Adobe Gì? Không! Không bao giờ làm cho các thư mục hệ thống có thể ghi cho người dùng. Quản lý gói của bạn đã biên dịch chúng cho bạn (theo những gì tôi đã cố gắng nói trong câu trả lời của mình). Bây giờ cập nhật để rõ ràng hơn về nó.
gertvdijk

Bây giờ bạn - tôi chỉ cần nhìn vào /usr/lib/python2.7/dist-packages/numpy- có pyctập tin. Tôi nhớ tôi đã xem ở đó trên các cài đặt thứ bảy - và chỉ có các tệp py đơn giản. Vì vậy, tôi sắp xếp "không thể tái tạo lỗi".
Adobe

Lý do duy nhất cho lý do tại sao .pycsẽ không có ở đó là gói chưa được cài đặt hoàn chỉnh. Sau khi giải nén có các bước khác để thực hiện. IIRC hook trung tâm python chỉ được chạy sau khi tất cả các gói được cài đặt. Vì vậy, trong phiên APT đang chạy hoặc bị gián đoạn cài đặt gói, quan sát bạn mô tả có thể được thực hiện.
gertvdijk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.