2014-12-24 14 views
6

Cách tốt nhất để tránh các tệp * .pyc cũ là gì? Đôi khi, đặc biệt là khi chuyển đổi các nhánh trong điều khiển phiên bản, một số tệp * .pyc còn lại ở đó và được sử dụng bởi Python thay vì các tệp nguồn mà tôi có.Cách tốt nhất để tránh các tệp * .pyc cũ?

Chiến lược tốt nhất để đảm bảo tôi không tạo hoặc vô tình sử dụng tệp * .pyc cũ là gì?

+2

how about gitignore '.pyc'? – Raptor

+2

@Raptor - nếu bạn chạy các mô-đun python trong thư mục repo của bạn thay vì sao chép hoặc cài đặt chúng ở nơi khác, bạn nhận được .pyc của khá bất kể gitignore. – tdelaney

Trả lời

2

Có một biến môi trường hữu ích cho điều đó: PYTHONDONTWRITEBYTECODE

export PYTHONDONTWRITEBYTECODE=true 
+0

Tất cả các câu trả lời hay. Điều này có vẻ là phương pháp duy nhất mà tôi không bao giờ phải nghĩ về các tệp * .pyc nữa. – nicholaides

1

Tôi muốn giới thiệu phương pháp kết hợp.

Trước tiên, hãy thêm *.pyc vào tệp .gitignore của bạn, giúp tránh các vấn đề khi chuyển nhánh (ít nhất là trong trường hợp nguyên nhân là tệp .pyc đã cam kết). Tôi thường luôn thêm cả hai *.pyc*.log vào .gitignore để không có khả năng thực hiện bất kỳ tệp nào trong số những tệp đó một cách vô tình và do đó chúng không làm lộn xộn đầu ra git status của tôi.

Thứ hai, tạo tập lệnh shell bao bọc đầu tiên xóa tất cả .pyc tệp (đệ quy nếu cấu trúc thư mục nguồn của bạn gọi) và sau đó gọi tập lệnh thực tế của bạn. Điều đó sẽ đảm bảo bất kỳ kết quả nào của các tệp .pyc mới được tạo bằng cách sử dụng nguồn hiện tại.

ví dụ: một cái gì đó tương tự (nếu không có sự & nếu bạn muốn kịch bản phải đợi):

#!/bin.sh 
rm -f *.pyc 
./foo.py & 
2

Tương tự như khampson, git và lanh lợi (và rất có thể những người khác) cho phép móc phía khách hàng. Bạn có thể rải xung quanh các tập lệnh làm

find -iname "*.pyc" -exec rm -f {} \; 

trên Linux ít nhất. Tìm kiếm "git hooks" và "mercurial hooks" để biết thêm chi tiết.

+2

'find -name '* .pyc' -delete' –

+0

@DietrichEpp - điểm tốt. Không '-delete' làm việc với các tập tin không ghi được và vv ... như' rm' với cờ hiệu lực? – tdelaney

+0

Có lẽ không, nhưng tôi không nghĩ rằng đó là một vấn đề. Lưu ý rằng bạn có thể muốn sử dụng 'rm -f - {} +' nếu bạn đi đường 'rm'. '--' ngăn các đối số không được hiểu là cờ, và' + 'làm' tìm 'đối với các lệnh gọi batch thành' rm'. –

1

giải pháp sẽ được imp.reload(). Tôi nghĩ rằng trong 2,7 bạn có thể làm những điều sau đây (sẽ kiểm tra sau)

>>> import sys 
>>> reload(sys) 
    <module 'sys' (built-in)> 
>>> 

Những bất lợi của phương pháp này là các phiên bản của tập tin * pyc của bạn vẫn sẽ được vào kho lưu trữ và cập nhật mỗi khi có một cam kết. Tuy nhiên nó sẽ bảo vệ bạn khỏi các phiên bản cũ của * .pyc.

Một giải pháp khác là tạo các tệp git ignore * .pyc cũng như xóa chúng. Một giải pháp khác là bỏ qua thư mục pycache. Từ cuốn sách của Mark Lutz:

Trong 3.2 và sau đó, Python thay vì tiết kiệm file mã byte pyc của nó trong một thư mục con tên pycache nằm trong thư mục nơi các tập tin nguồn của bạn cư trú, và trong các tập tin có tên xác định phiên bản Python đã tạo chúng (ví dụ: script.cpython-33.pyc). pycache thư mục con mới giúp để tránh lộn xộn và quy ước đặt tên mới cho các tệp mã byte ngăn các phiên bản Python khác nhau được cài đặt trên cùng một máy tính từ ghi đè mã byte đã lưu của nhau.

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