2012-06-27 33 views
5

Tôi cần phát triển tập lệnh sẽ khởi chạy một số tính toán. Bạn muốn tập lệnh này xử lý^C chính xác bằng cách xóa một số thư mục tạm thời. Tôi đã thử một vài phiên bản của mã trong signal_handler:Python, xóa thư mục: lỗi Tệp tồn tại

shutil.rmtree(self.temp) 

hoặc thậm chí

os.system("rm -rf " + self.temp) 

khi tôi làm gián đoạn việc thực hiện và xử lý được gọi là để loại bỏ các thư mục, tôi nhận được lỗi như:

OSError: [Errno 17] File exists : 'foo' 

hoặc

rm: Unable to remove directory foo: File exists 

Sau khi thực thi, thư mục tôi muốn xóa bị trống, và tôi có thể xóa nó bằng một rm -r trong vỏ. Tuy nhiên, nếu tôi thực thi mã:

for f in os.listdir(self.temp): 
    os.remove(os.path.join(self.temp,f)) 

for f in os.listdir(self.temp): 
    print f 

os.rmdir(self.temp) 

tôi, tất nhiên, nhận lỗi, nhưng vòng lặp thứ hai tìm thấy tập tin này: .nfsA13D3

Bất cứ ai cũng có một giải pháp cho vấn đề của tôi? Cảm ơn bạn!

+6

'.nfs *' tệp được tạo khi bạn 'rm' một tệp trên một gắn kết NFS vẫn đang được sử dụng bởi một cái gì đó. Khi số lượng tham chiếu trên tệp '.nfs' giảm xuống 0, nó * sẽ * biến mất (tôi đã chạy vào các trường hợp trong quá khứ, nơi nó không phải lúc nào, mặc dù, yêu cầu dọn dẹp thủ công). – twalberg

Trả lời

0

Cảm ơn bạn đã nhận xét, tôi đã mở tệp trong mã python của tôi và signal_handler của tôi không kiểm tra xem các đối tượng tệp của tôi đã bị đóng hay chưa. Đây là lý do tại sao tôi không thể xóa thư mục chứa các tệp này trong tập lệnh.

7

Đây là sự cố nổi tiếng với hệ thống tệp được nfs gắn một số tiện ích của bạn không đóng tệp. Một hệ điều hành có thể giữ cho tập tin vẫn còn sống ngay cả khi bạn loại bỏ nó, nhưng điều này là không thể khi nfs được tham gia. Giải pháp cho os là tạo ra tệp .nfs tạm thời và giữ cho nó xung quanh cho đến khi bộ mô tả tệp đang được sử dụng.

Không có giải pháp thực sự cho vấn đề này. Tệp .nfs sẽ biến mất khi trình mô tả cuối cùng bị đóng, nhưng thư mục (trống) sẽ vẫn ở xung quanh. Cách khắc phục duy nhất có thể là tìm phần mô tả tệp vẫn mở và đóng nó, nhưng nó phụ thuộc nếu nó nằm trong chương trình của bạn. Trong trường hợp của tôi, nó ở trong một thư viện được biên dịch bên ngoài và tôi không có cơ hội để tìm nơi nó bị rò rỉ.

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