2014-04-19 15 views
6

Tôi khá thiếu kinh nghiệm với python, vì vậy tôi thấy mình thua lỗ như thế nào để tiếp cận lỗi này. Tôi đã thừa kế một ứng dụng python mà chủ yếu chỉ sao chép các tập tin và thư mục từ nơi này sang nơi khác. Tất cả các tệp và thư mục đều nằm trên máy cục bộ và người dùng có toàn quyền quản trị, do đó không có vấn đề về mạng hoặc bảo mật tại đây.Gỡ lỗi chiến lược cho một lỗi (rõ ràng) bị ảnh hưởng bởi thời gian

Điều tôi thấy là một số tệp không được sao chép từ thư mục này sang thư mục khác trừ khi tôi làm chậm mã bằng cách nào đó. Nếu tôi chỉ chạy chương trình nó không thành công, nhưng nếu tôi bước qua với một trình gỡ rối hoặc thêm các câu lệnh print vào vòng lặp bản sao, nó sẽ thành công. Sự khác biệt dường như là thời gian của vòng lặp hoặc di chuyển mọi thứ xung quanh trong bộ nhớ.

Tôi đã nhìn thấy loại lỗi này trong các ngôn ngữ được biên dịch trước đây và thường chỉ ra một điều kiện chủng tộc hoặc tham nhũng bộ nhớ. Tuy nhiên, chỉ có một chủ đề và không có tương tác với các quy trình khác, vì vậy một điều kiện chủng tộc dường như là không thể. Bộ nhớ tham nhũng vẫn là một khả năng, nhưng tôi không chắc chắn làm thế nào để điều tra khả năng đó với python.

Đây là vòng lặp được đề cập. Như bạn thấy, nó khá đơn giản:

def concat_dirs(dir, subdir): 
    return dir + "/" + subdir 

for name in fullnames: 
    install_name = concat_dirs(install_path, name) 
    dirname = os.path.dirname(install_name) 
    if not os.path.exists(dirname): 
     os.makedirs(dirname) 
    shutil.copyfile(concat_dirs(java_path, name), install_name) 

Đó loop thường thất bại trong việc sao chép các tập tin, trừ khi tôi hoặc bước qua nó với một trình gỡ lỗi hoặc thêm tuyên bố này sau khi dòng shutil.copyfile.

print "copied ", concat_dirs(java_path, name), " to ", install_name 

Nếu tôi thêm tuyên bố đó hoặc bước qua gỡ lỗi, vòng lặp hoạt động hoàn hảo và nhất quán. Tôi bị cám dỗ để nói "đủ tốt" với tuyên bố print nhưng tôi biết đó là chỉ che giấu một vấn đề cơ bản.

Tôi không yêu cầu bạn gỡ lỗi mã vì tôi biết bạn không thể; Tôi đang yêu cầu một chiến lược gỡ lỗi. Làm cách nào để tiếp cận việc tìm lỗi này?

+1

Con trăn có gây ra bất kỳ lỗi nào hay chỉ là các tệp không được sao chép? – ebarr

+0

concat_dirs là gì? Tại sao không chỉ sử dụng os.path.join? Có gì trong hàm đó? – jmq

+0

Nếu nó thực sự là một vấn đề thời gian (và không gọi 'concat_dirs' thêm thời gian để sửa đổi thứ gì đó tạo nên sự khác biệt), thì một chiến lược có thể là bạn có thể tăng tốc độ ghi nhật ký của mình một cách đáng kể. các thông điệp tường trình ở đâu đó. In chúng ra sau khi hành vi xấu đã xảy ra (nếu có). –

Trả lời

1

Bạn do có điều kiện chủng tộc: bạn kiểm tra sự tồn tại của tên dirname và sau đó thử tạo nó. Điều đó nên làm cho chương trình phát nổ nếu có điều gì đó không mong muốn xảy ra, nhưng ...

Trong Python, chúng tôi nói rằng việc yêu cầu tha thứ hơn là cho phép dễ dàng hơn. Đi trước và tạo thư mục mà mỗi lần, sau đó xin lỗi nếu nó đã tồn tại:

import errno 
import os 

for name in fullnames: 
    source_name = os.path.join(java_path, name) 
    dest_name = os.path.join(install_path, name) 
    dest_dir = os.path.dirname(dest_name) 

    try: 
     os.makedirs(dest_dir) 
    except OSError as exc: 
     if exc.errno != errno.EEXIST: 
      raise 

    shutil.copyfile(source_name, dest_name) 

Tôi không chắc chắn làm thế nào tôi muốn khắc phục sự cố này, ngoại trừ bằng cách cố gắng điều đó một cách không đặc sắc và nhìn thấy những gì xảy ra. Có thể có một vấn đề hệ thống tập tin tinh vi mà làm cho điều này chạy kỳ quặc.

+0

Tôi sẽ ngạc nhiên nếu đây là nguyên nhân gây ra vấn đề. Nếu chỉ có một luồng và đây là quá trình duy nhất sử dụng các thư mục này thì vấn đề này sẽ không liên quan (mặc dù đó là cách thức làm việc theo chiều sâu). – ebarr

+0

@ebarr Tôi cũng hoài nghi, nhưng không có gì khác nổi bật. Tôi tự hỏi nếu đó là một điều bộ nhớ cache Windows đỏ bừng, đặc biệt nếu đích đến trên một mạng chia sẻ. –

+0

+1 cho lời khuyên chung về Python, và tôi đã thực hiện nó trong suốt mã, nhưng tôi e rằng nó không giải quyết được vấn đề. –

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