2010-08-17 32 views
21

Có cách nào để làm cho Python bỏ qua bất kỳ tệp .pyc nào có mặt và luôn diễn giải tất cả mã (kể cả các mô-đun đã nhập) trực tiếp không? Google đã không trả lời bất kỳ câu trả lời nào, vì vậy tôi nghi ngờ là không, nhưng có vẻ như đáng để hỏi chỉ trong trường hợp.Làm cho Python bỏ qua các tệp .pyc

(Tại sao tôi muốn làm điều này? Tôi có một đường ống lớn các tập lệnh Python được chạy liên tục trên một cụm vài trăm máy tính. Bản thân các tập lệnh Python sống trên một hệ thống tệp NFS được chia sẻ. đã được chạy hàng trăm lần trong vài giờ, chúng sẽ đột nhiên bắt đầu gặp lỗi với việc không thể nhập mô-đun. Việc buộc tái tạo tệp .pyc sẽ khắc phục sự cố. Tôi muốn, tất nhiên, để khắc phục các nguyên nhân cơ bản nhưng trong thời gian chờ đợi, chúng tôi cũng cần hệ thống để tiếp tục chạy, vì vậy có vẻ như bỏ qua tệp .pyc nếu có thể sẽ là giải pháp hợp lý).

P.S. Tôi đang sử dụng Python 2.5, vì vậy tôi không thể sử dụng -B.

Trả lời

12

Bạn thể sử dụng mô-đun imp tiêu chuẩn Python thư viện để reimplement __builtins__.__import__, đó là chức năng móc gọi bằng importfrom tuyên bố. Đặc biệt, có thể sử dụng chức năng imp.load_module để tải .py ngay cả khi có .pyc tương ứng. Hãy chắc chắn nghiên cứu cẩn thận tất cả các tài liệu trong trang tôi đã chỉ ra, cộng với những tài liệu cho import, vì đó là một công việc tinh tế. Các tài liệu tự đề nghị sử dụng móc nhập khẩu thay vì (mỗi PEP 302) nhưng đối với nhiệm vụ cụ thể này, tôi nghi ngờ rằng sẽ còn khó khăn hơn.

BTW, nguyên nhân có thể xảy ra cho các sự cố quan sát của bạn bao gồm điều kiện cuộc đua giữa các máy tính khác nhau cố gắng viết .pyc tệp cùng một lúc - NFS khóa nổi tiếng là flaky và luôn là ;-). Miễn là mọi trình biên dịch Python bạn đang sử dụng đều có cùng phiên bản (nếu không, bạn vẫn gặp rắc rối lớn ;-), tôi muốn biên dịch trước tất cả các tệp .py thành .pyc và làm cho các thư mục của chúng chỉ đọc; sau này có vẻ là cách tiếp cận đơn giản nhất (thay vì hack __import__), ngay cả khi vì một lý do nào đó bạn không thể biên dịch trước được.

0

Có lẽ bạn có thể làm việc xung quanh điều này bằng cách, ví dụ, lên lịch một công việc định kỳ tắt các tập lệnh và xóa các tệp .pyc.

11

Nó không chính xác những gì bạn yêu cầu, nhưng sẽ loại bỏ các tệp .pyc hiện có và sau đó không tạo thêm bất kỳ công việc nào cho bạn? Trong trường hợp đó, bạn có thể sử dụng tùy chọn -B:

>python --help 
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... 
Options and arguments (and corresponding environment variables): 
-B  : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x 
+0

Thật tuyệt vời, ngoại trừ điều đó không may vì những lý do ngoài tầm kiểm soát của tôi, tôi bị kẹt bằng cách sử dụng Python 2.5, không có -B. Nên đã đề cập rằng trong câu hỏi, xin lỗi! –

0

Vâng, tôi không nghĩ rằng Python bao giờ diễn giải mã trực tiếp nếu bạn đang tải mã từ một tệp. Ngay cả khi sử dụng trình bao tương tác, Python sẽ biên dịch mô-đun đã nhập thành tệp .pyc.

Điều đó nói rằng, bạn có thể viết tập lệnh shell để tiếp tục và xóa tất cả các tệp .pyc trước khi khởi chạy tập lệnh của mình. Điều đó chắc chắn sẽ buộc phải xây dựng lại toàn bộ trước khi thực hiện.

5

Trong trường hợp bất cứ ai đang sử dụng python 2,6 hoặc cao hơn với cùng một câu hỏi, điều đơn giản nhất để làm là:

  1. Xóa tất cả các file pyc
  2. Chạy tất cả các thông dịch viên python của bạn với các tùy chọn -B, vì vậy họ sẽ không tạo tệp .pyc.

Từ các tài liệu:

-B Nếu nhất định, Python sẽ không cố gắng để viết pyc hoặc các tập tin .pyo về việc nhập khẩu các module nguồn. Xem thêm PYTHONDONTWRITEBYTECODE.

Tính năng mới trong phiên bản 2.6.

Nếu bạn không thể xóa tất cả các .pycs, sau đó bạn có thể:

1) Chạy tất cả các thông dịch viên python của bạn với các tùy chọn -B -O.

Điều này sẽ yêu cầu python tìm kiếm tệp .pyo cho bytecode thay vì tệp .pyc (-O) và yêu cầu python không tạo bất kỳ tệp bytecode nào (-B).

Kết hợp hai tùy chọn, giả sử bạn chưa sử dụng chúng trước đây, là Python sẽ không tạo bất kỳ tệp bytecode nào và sẽ không tìm kiếm tệp bytecode có thể được tạo bởi các lần chạy cũ hơn.

Từ các tài liệu:

-B Nếu nhất định, Python sẽ không cố gắng để viết pyc hoặc các tập tin .pyo về việc nhập khẩu các module nguồn. Xem thêm PYTHONDONTWRITEBYTECODE.

Tính năng mới trong phiên bản 2.6.

-O Bật tối ưu hóa cơ bản. Điều này thay đổi phần mở rộng tên tệp cho các tệp được biên dịch (bytecode) từ .pyc thành .pyo. Xem thêm PYTHONOPTIMIZE.

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