2009-01-23 29 views
27

Có thể để Python lưu các tệp .pyc vào một vị trí thư mục riêng biệt có trong sys.path không?Cách để biên dịch các tệp python trong một thư mục riêng biệt?

/code 
    foo.py 
    foo.pyc 
    bar.py 
    bar.pyc 

Để:

/code 
    foo.py 
    bar.py 
/code_compiled 
    foo.pyc 
    bar.pyc 

Tôi muốn này bởi vì tôi cảm thấy nó muốn được có tổ chức hơn. Cảm ơn vì sự giúp đỡ của bạn.

+0

Bạn đã thử Python 3.2 như thế nào? Nó thực hiện PEP 3147: Thư mục Kho lưu trữ PYC (http://www.python.org/dev/peps/pep-3147/). –

+0

Nếu bạn không quan tâm đến tệp .pyc, bạn có thể sử dụng 'os.system ('del * .pyc')' (cửa sổ, ví dụ) ở cuối tập lệnh. – Charlie

Trả lời

17

PEP 304: Controlling Generation of Bytecode Files. Trạng thái của nó là Withdrawn và tương ứng patch bị từ chối. Do đó có thể không có cách trực tiếp để làm điều đó.

Nếu bạn không cần mã nguồn thì bạn chỉ có thể xóa các tệp *.py. *.pyc tệp có thể được sử dụng như hoặc được đóng gói trong một quả trứng.

+3

cập nhật: [Thư mục lưu trữ PYC] (http://www.python.org/dev/peps/pep-3147/) – jfs

+0

Bạn có thể chỉnh sửa câu trả lời của mình bằng thông tin chi tiết về bản cập nhật. –

+1

Err. Xem thêm xuống. Câu trả lời ngắn gọn là không có cách nào ngoại trừ thực sự hacky trong Python 2.x; tầm thường trong Python 3.2 và mới hơn. –

-1

"Tôi cảm thấy nó sẽ được tổ chức hơn" Tại sao? Làm sao? Bạn đang cố gắng để thực hiện?

Điểm lưu đầu ra trình biên dịch là tiết kiệm một chút thời gian tải khi mô-đun được nhập. Tại sao làm điều này phức tạp hơn? Nếu bạn không thích tệp .pyc's, hãy chạy tập lệnh "delete all .pyc's" định kỳ.

Chúng không cần thiết; chúng hữu ích. Tại sao tắt trợ giúp đó?

Đây không phải là C, C++ hoặc Java, nơi các đối tượng kết quả là cần thiết. Đây chỉ là một bộ nhớ cache mà Python sẽ sử dụng. Chúng tôi đánh dấu chúng là "bị bỏ qua" trong Subversion để chúng không vô tình làm gió lên việc đăng ký.

+6

> Tại sao? Rõ ràng là vì chúng làm cho đầu ra ls hoặc danh sách tệp Windows Explorer vi phạm nhiều hơn. Mối quan tâm chủ quan nhưng khá hợp pháp, phải không? – Maleev

+0

@Maleev: "trực quan lộn xộn"? Explorer có thể được sắp xếp theo loại tệp để đặt tệp .pyc ở nơi khác. Linux 'ls' có thể được sử dụng với một thẻ hoang dã (tức là,' ls * .py').Cố gắng sắp xếp lại các tệp là một sự lãng phí thời gian lớn khi bạn có những cách tầm thường để giảm sự lộn xộn trực quan. –

+0

Di chuyển vị trí tệp .pyc không giống như tắt tính năng. Cũng không làm như vậy làm cho trình thông dịch Python phức tạp hơn. Lập luận được đưa ra dựa trên sự hiểu lầm về bộ nhớ cache thực sự là gì (một cơ sở lưu trữ tạm thời được thiết kế để nâng cao vị trí tham chiếu). Bộ nhớ cache, theo định nghĩa, cả bị mất và được bản địa hóa. Các tệp .pyc rải rác trong toàn bộ hệ thống phân cấp của dự án Python sẽ đánh bại mục đích của bộ nhớ cache. Tốt nhất bạn có thể nói đó là một tối ưu hóa với chi phí vệ sinh hệ thống phân cấp tệp. –

3

Tôi đồng ý, phân phối mã của bạn như một quả trứng là một cách tuyệt vời để giữ cho nó được tổ chức. Điều gì có thể được tổ chức nhiều hơn một tệp đơn chứa tất cả mã và siêu dữ liệu mà bạn cần. Thay đổi cách trình biên dịch bytecode hoạt động sẽ chỉ gây nhầm lẫn.

Nếu bạn thực sự không thích vị trí của các tệp pyc đó, cách khác là chạy từ thư mục chỉ đọc. Kể từ khi python sẽ không thể viết, không có tập tin pyc bao giờ được thực hiện. Các hit bạn có là mỗi tập tin python sẽ phải được tái biên dịch ngay khi nó được nạp, bất kể bạn đã thay đổi nó hay không. Điều đó có nghĩa là thời gian khởi động của bạn sẽ tồi tệ hơn rất nhiều.

3

Tôi không đồng ý. Lý do sai hoặc ít nhất là không được xây dựng tốt; nhưng hướng là hợp lệ. Có những lý do tốt để có thể tách biệt mã nguồn khỏi các đối tượng được biên dịch. Dưới đây là một vài trong số đó (tất cả chúng tôi đã chạy vào một thời điểm nào đó) (

  • thiết bị nhúng đọc ROM nhưng có thể sử dụng hệ thống tệp bộ nhớ trên RAM.
  • môi trường đa os có nghĩa là chia sẻ (với samba/nfs/bất kỳ) thư mục làm việc của tôi và xây dựng trên nhiều nền tảng.
  • công ty thương mại có nhu cầu chỉ phân phối PYC để bảo vệ IP
  • bộ kiểm tra dễ dàng chạy cho nhiều phiên bản của python bằng cách sử dụng thư mục làm việc cùng
  • dễ dàng hơn dọn dẹp các file chuyển tiếp (rm -rf $ OBJECT_DIR như trái ngược với tìm . -name '* .pyc' -exec rm -f {} \;)

Có giải pháp cho tất cả các vấn đề này, NHƯNG chúng hầu hết là giải pháp KHÔNG giải pháp.Giải pháp thích hợp trong hầu hết các trường hợp này là để phần mềm chấp nhận một vị trí thay thế để lưu trữ và tra cứu các tệp chuyển tiếp này.

2

Nếu bạn sẵn sàng hy sinh thế hệ bytecode hoàn toàn cho nó, có một cờ dòng lệnh:

python -B file_that_imports_others.py 

có thể được đưa vào xây dựng/preferences chạy IDE

1

Kể từ Python 3.2 đã được triển khai PEP 3147: điều này có nghĩa rằng tất cả các file pyc được tạo ra bên trong một __ pycache __ thư mục (sẽ có một __ pycache __ thư mục cho mỗi thư mục, nơi bạn có Các tệp Python và nó sẽ giữ các tệp .pyc cho mỗi phiên bản Python được sử dụng trên các nguồn)

14

Vào những ngày đen tối và cổ xưa của năm 2003, PEP 304 xuất hiện để thách thức vấn đề này. Bản vá của nó đã được tìm thấy mong muốn. Các phụ thuộc nền tảng biến môi trường và các phiên bản nghiêng xé nó thành các mảnh vụn và để các bit của nó nằm rải rác trên các vùng đất hoang.

Sau nhiều năm đau khổ, một thách thức mới đã tăng trong những ngày cuối cùng của năm 2009. Barry Warsaw triệu tập PEP 3147 và gửi nó để chiến đấu, sử dụng một vũ khí đơn giản với kỹ năng. PEP đã nghiền nát các tập tin PYC lộn xộn, làm im lặng các thông dịch viên Unladen Swallow và CPython đang cố gắng tranh luận rằng tập tin PYC của nó nên chiến thắng, và cho phép Python dễ dàng nghỉ ngơi với những con ma chết của nó thỉnh thoảng chạy trong đêm khuya. PEP 3147 được nhà độc tài tìm thấy xứng đáng và được phong tước hiệp sĩ chính thức trong những ngày 3.2.

Kể từ 3.2, Python lưu trữ tệp PYC của mô-đun trong __pycache__ trong thư mục của mô-đun. Mỗi tệp PYC chứa tên và phiên bản của thông dịch viên, ví dụ: __pycache__/foo.cpython-33.pyc. Bạn cũng có thể có một __pycache__/foo.cpython-32.pyc được biên dịch bằng phiên bản Python cũ hơn. Ma thuật phù hợp xảy ra: ma thuật chính xác được sử dụng và biên dịch lại nếu không đồng bộ với mã nguồn. Khi chạy, hãy xem mô-đun mymodule.__cached__ của mô-đun đối với tên tệp pyc và phân tích cú pháp nó bằng imp.get_tag(). Xem the What's New section để biết thêm thông tin.

TL; DR - Chỉ hoạt động trong Python 3.2 trở lên. Hacks nghèo thay thế cho các phiên bản trước đó.

+1

PEP 3147 chỉ là giải pháp một phần. '__pycache__' thư mục vẫn còn lộn xộn mã nguồn. Chính khó chịu cho tôi với pycs là thư mục còn lại undeleted sau 'svn switch' hay như vậy. – Suor

+0

Dường như một vấn đề về thẩm mỹ: tệp .pyc được lưu trong bộ nhớ cache sẽ chỉ được sử dụng cho các đối sánh dấu thời gian chính xác; có lẽ từ filecmp.filecmp (nông = True). Mặc dù không đẹp, không nên sử dụng thêm bộ đệm. –

+0

Hãy cầu nguyện cho rằng, giống như hầu hết mọi thứ trong 3.2, điều này cũng được bao gồm trong 2.7? – ArtOfWarfare

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