2009-07-31 6 views
25

Tôi đang cố gắng để có python xóa một số thư mục và tôi nhận được lỗi truy cập vào chúng. Tôi nghĩ rằng tài khoản người dùng python của nó không có quyền?Người dùng nào làm các tập lệnh python chạy như trong các cửa sổ?

WindowsError: [Error 5] Access is denied: 'path' 

là những gì tôi nhận được khi chạy tập lệnh.
Tôi đã thử

shutil.rmtree 
os.remove 
os.rmdir 

tất cả họ đều trở về cùng một lỗi.

+0

Vâng, với tài khoản người dùng * nào * bạn chạy tập lệnh?Thông thường bạn nên biết, ít nhất là trên máy của bạn và nếu bạn thiết lập kịch bản để chạy ... – Joey

+0

Tôi chỉ chạy nó như bản thân mình, và tôi có thể xóa trực tiếp bằng tay, vì vậy tôi đang nghĩ về một cửa sổ lạ và python permissions ngắt kết nối – DevelopingChris

+0

Thử chạy kịch bản với "Process Monitor" của SysInternals để xem chính xác đối tượng nào (tệp, thư mục hoặc bất cứ điều gì) xảy ra và quá trình đó xảy ra. "Process Explorer" có thể cho bạn biết quá trình này là gì chạy dưới (có thể Process Monitor có thể quá, tôi không chắc chắn). –

Trả lời

49

Chúng tôi đã gặp sự cố khi xóa tệp và thư mục trên Windows, ngay cả khi chúng tôi vừa sao chép chúng, nếu chúng được đặt thành 'chỉ đọc'. shutil.rmtree() cung cấp cho bạn loại trình xử lý ngoại lệ để xử lý tình huống này. Bạn gọi nó và cung cấp một trình xử lý ngoại lệ như sau:

import errno, os, stat, shutil 

def handleRemoveReadonly(func, path, exc): 
    excvalue = exc[1] 
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES: 
     os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777 
     func(path) 
    else: 
     raise 

shutil.rmtree(filename, ignore_errors=False, onerror=handleRemoveReadonly) 

Bạn có thể muốn thử điều đó.

+2

Cũng thấy chức năng 'onerror' trong http://www.voidspace.org.uk/downloads/pathutils.py –

+0

Tôi nhận được: NameError: tên 'stat' không được xác định EDIT: Yêu cầu bạn thực hiện ' nhập stat 'ở đầu tập lệnh của bạn. Đã giải quyết vấn đề của tôi mặc dù. Cảm ơn nhiều! – anon58192932

+2

Tôi đã thử giải pháp này, bây giờ tôi có lỗi '[Lỗi 5] Truy cập bị từ chối' với dòng này:' os.chmod (đường dẫn, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) # 0777 ' – Johanna

4

Tôi chưa bao giờ sử dụng Python, nhưng tôi cho rằng nó chạy như bất kỳ người dùng nào thực thi tập lệnh.

+0

ok, do đó, nó dường như chạy như tôi, tại sao tôi không thể xóa các tập tin thông qua python, nhưng tôi có thể nếu tôi chỉ cần xóa nó thông qua rmdir trên dòng lệnh? – DevelopingChris

+0

Bạn có chỉ đường dẫn được mã hóa cứng không? Bạn có chắc đó là con đường chính xác? Tôi không thể nghĩ ra lý do tại sao nó sẽ không hoạt động nếu bạn có thể làm điều đó bằng tay. –

+0

vâng, tôi đã tự động nhận được đường dẫn từ danh sách, nhưng sau đó khi đã được nâng lên, tôi chỉ cần đặt cùng một đường dẫn trong python, thiết lập kịch bản và python không thể xóa nó nhưng tôi có thể nếu tôi sử dụng cmd – DevelopingChris

0

Bạn đang chạy tập lệnh như thế nào? Từ phiên giao diện điều khiển tương tác? Nếu vậy, chỉ cần mở một cửa sổ lệnh DOS (sử dụng cmd) và gõ 'whoami'. Đó là những người bạn đang chạy các kịch bản tương tác.

Ok tôi đã xem các chỉnh sửa của bạn ngay bây giờ ... tại sao bạn không in đường dẫn và kiểm tra thuộc tính để xem tài khoản người dùng chạy tập lệnh có các đặc quyền bắt buộc không?

Nếu whoami không hoạt động trên phiên bản Windows của bạn, bạn có thể sử dụng các biến môi trường như SET USERNAME và SET DOMAINNAME từ cửa sổ lệnh của bạn.

+1

whoami là lệnh * nix, không phải cửa sổ. –

+2

@ Max - bạn đã thử trên Windows chưa? Nó hoạt động tốt. – Kevin

+0

Tôi vừa thử nó, nó không hoạt động với tôi –

0

Nếu tập lệnh đang được chạy dưới dạng tác vụ được lên lịch (có vẻ như có khả năng cho tập lệnh dọn dẹp), có thể nó sẽ chạy dưới dạng SYSTEM. Đó là (không khôn ngoan, nhưng) có thể thiết lập quyền trên các thư mục để SYSTEM không có quyền truy cập.

+0

Tác vụ được lập lịch chạy như bất kỳ người dùng nào bạn yêu cầu nó chạy. Mặc dù, tôi nghĩ rằng trên các phiên bản cũ của cửa sổ này là không đúng sự thật. –

0

Các thư mục có trống không và nếu không thực hiện các phương pháp đó có hỗ trợ xóa nội dung thư mục một cách decursively không?

3

Các tập lệnh không có người dùng đặc biệt, chúng chỉ chạy dưới người dùng hiện đã đăng nhập đã thực thi tập lệnh.

Các bạn đã thử kiểm tra xem:

  • bạn đang cố gắng để xóa một đường dẫn hợp lệ? và rằng
  • đường dẫn không có tệp bị khóa?
0

@ThomasH: một viên gạch khác vào tường.

Trên hệ thống Unix, bạn phải đảm bảo rằng thư mục gốc cũng có thể ghi. Đây là một phiên bản khác:

def remove_readonly(func, path, exc): 
    excvalue = exc[1] 
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES: 

     # ensure parent directory is writeable too 
     pardir = os.path.abspath(os.path.join(path, os.path.pardir)) 
     if not os.access(pardir, os.W_OK): 
      os.chmod(pardir, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) 

     os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777 
     func(path) 
    else: 
     raise 
+0

Theo [Tài liệu Python] (https://docs.python.org/2/library/shutil.html?highlight=shutil#shutil.rmtree), _Exceptions do onerror đưa ra sẽ không được caught_ vì vậy tôi không chắc chắn câu lệnh _raise_ có nghĩa là gì không. – kmarsh

0

Giải pháp đơn giản sau khi tìm kiếm giờ là kiểm tra trước nếu thư mục đó thực sự tồn tại!

GIT_DIR="C:/Users/...." 
if os.path.exists(GIT_DIR): 
    shutil.rmtree(GIT_DIR) 

Điều này đã làm cho tôi.

+0

Sự khác biệt là, tôi vừa tạo nó trong dòng mã trước. Vì vậy, nó 100% tồn tại cho một số. Nhưng có một vấn đề truy cập trong bộ điều hợp mức hệ điều hành của các cửa sổ. – DevelopingChris