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?
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
concat_dirs là gì? Tại sao không chỉ sử dụng os.path.join? Có gì trong hàm đó? – jmq
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ó). –