2012-06-06 32 views
7

Chỉ mới bắt đầu sử dụng Mercurial. Wow, ứng dụng đẹp. Tôi đã chuyển tệp cơ sở dữ liệu của mình ra khỏi thư mục mã, nhưng tôi đã tự hỏi về các tệp .pyc. Tôi không đưa chúng vào cam kết ban đầu. Tài liệu về tệp .hgignore bao gồm ví dụ để loại trừ *.pyc, vì vậy tôi nghĩ rằng tôi đang đi đúng hướng.Việc cần làm với tệp pyc khi Django hoặc python được sử dụng với Mercurial?

Tôi tự hỏi điều gì sẽ xảy ra khi tôi quyết định quay lại tệp cũ hơn. Tôi có cần xóa tất cả các tệp .pyc sau đó không? Tôi đã thấy một số câu hỏi về Stack Overflow về vấn đề này, bao gồm một quý ông đã tìm thấy các tệp cũ .pyc đang được sử dụng. Cách tiêu chuẩn xung quanh điều này là gì?

+0

Bạn có sử dụng Mercurial trong Linux không? Và bạn có sử dụng ứng dụng dòng lệnh 'hg' hoặc một số ứng dụng GUI không? – Kirill

+1

Tôi thích đặt PYTHONDONTWRITEBYTECODE trong quá trình phát triển để tránh bị nhức đầu pyc hoàn toàn. – georg

+0

-> Kirill: Tôi đang sử dụng Mercurial theo MacOS X để phát triển web Django cho thực hành y tế của tôi. Thật thú vị khi xem các tập tin đến và đi trong GUI khi ứng dụng dòng lệnh hg hoạt động ma thuật của nó. -> thg435: Cảm ơn bạn đã chỉ ra tùy chọn PYTHONDONTWRITEBYTECODE. – kd4ttc

Trả lời

13

Như đã đề cập trong câu trả lời của ms4py, * pyc được file đó sẽ được tái tạo một cách nhanh chóng biên soạn. Bạn sẽ không muốn bao gồm những điều này khi phân phối một dự án. Tuy nhiên, nếu điều đó xảy ra, bạn có các mô-đun tồn tại trước khi bạn khôi phục các thay đổi và các tệp * .pyc nằm xung quanh, các lỗi lạ có thể xuất hiện dưới dạng tệp pyc có thể được thực thi ngay cả khi tệp python gốc không tồn tại nữa không. Điều này đã cắn tôi một vài lần trong Django khi thêm và loại bỏ các ứng dụng trong một dự án và chuyển đổi chi nhánh với git.

Để làm sạch những thứ lên, bạn có thể xóa tất cả các file được biên soạn trong thư mục của dự án của bạn bằng cách chạy lệnh shell sau trong thư mục bạn của dự án:

find . -name '*.pyc' -exec rm {} \; 
+8

Hầu hết 'find's cũng hỗ trợ' -delete' thay thế của '-exec rm {} \;'. – Dougal

+1

Nếu cơ sở mã của bạn không có lỗi, sự cố này không xảy ra trong quy trình làm việc mặc định của mercurial (vì bạn không bao giờ nhập từ * .pyc không có * .py tương ứng). – schlamar

+1

OK, do đó, có vẻ như điều đúng đắn cần làm là thực hiện 'hg commit' trong khoảng thời gian. Nếu lùi lại, hãy chạy 'find. -name '* .pyc' -delete' sau khi quay trở lại làm tùy chọn. Nó là tốt để loại trừ các tập tin * .pyc nói chung từ Mercurial. – kd4ttc

0

Chắc chắn nếu bạn có tệp .pyc từ phiên bản cũ của cùng một mô-đun python sẽ sử dụng nó. Nhiều lần tôi đã tự hỏi tại sao chương trình của tôi không phản ánh những thay đổi mà tôi đã thực hiện, và nhận ra đó là vì tôi có các tệp pyc cũ.

Nếu điều này có nghĩa là .pyc không phản ánh phiên bản hiện tại của bạn thì có, bạn sẽ phải xóa tất cả .pyc tệp.

Nếu bạn đang ở trên linux bạn có thể find . -name *.pyc -delete

+2

Cách này trả lời câu hỏi? OP đề cập đến việc bỏ qua '.pyc' trong VCS rồi. –

+0

Như tôi đã hiểu từ câu hỏi, @ kd4ttc đã thực hiện việc này. – Kirill

5

Thông thường bạn được an toàn, bởi vì *.pyc được tái sinh nếu *.py tương ứng thay đổi nội dung của nó.

Có vấn đề nếu bạn xóa tệp *.py và bạn vẫn đang nhập từ tệp đó trong một tệp khác. Trong trường hợp này, bạn đang nhập từ tệp *.pyc nếu tệp hiện có. Nhưng điều này sẽ là một lỗi trong mã của bạn và không thực sự liên quan đến quy trình làm việc của bạn.

Kết luận: Mỗi thư viện Python nổi tiếng được bỏ qua *.pyc tập tin của họ, chỉ cần làm điều đó;)

+1

Tôi đồng ý. Đối với hầu hết các phần, mọi thứ "chỉ làm việc". Nếu bạn nhận được hành vi lạ từ dự án của bạn (mã đang chạy mà bạn * biết * không còn ở đó nữa, ví dụ), sau đó xóa các tệp * .pyc của bạn. Nếu không, đừng lo lắng về nó. –

+0

Nếu bạn đang xóa các mô-đun nhưng vẫn nhập chúng, mong đợi một ImportError thay vì tải một tập tin .pyc cũ, đó có thể là một dấu hiệu bạn đang làm một cái gì đó ... – geoffspear

3

Đối với một giải pháp tổng quát hơn, sau đó yêu cầu Mercurial tự về những file nào nó bỏ qua:

$ hg status --ignored 

Bạn có thể làm cho an toàn đầu ra cho xargs tiêu thụ:

$ hg status --ignored --no-status -0 | xargs -0 -delete 

(-0 là điều quan trọng để xử lý tệp có dấu cách trong tên.) Bạn có thể cài đặt này như một cái móc sau update:

[hooks] 
post-update = hg status --ignored --no-status -0 | xargs -0 -delete 

Cuối cùng, Mercurial đi kèm với một purge extension rằng làm điều gì đó tương tự:

$ hg purge --all 

sẽ xóa cả file untracked và bỏ qua. Nếu bạn không hài lòng với việc mất các tập tin không được theo dõi, thì lệnh đó có lẽ là dễ nhất cho bạn, đặc biệt là vì nó cũng hoạt động trên Windows, nơi có thể khó truy cập vào xargs.

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