2013-03-25 31 views
71

Gần đây tôi đang sử dụng mô-đun Python os, khi tôi cố thay đổi sự cho phép của một tập tin, tôi đã không nhận được kết quả mong đợi. Ví dụ, tôi có ý định thay đổi sự cho phép để RW-rw-r--,Mô-đun Python os.chmod (tệp, 664) không thay đổi quyền đối với rw-rw-r-- nhưng -w - wx ----

os.chmod("/tmp/test_file", 664) 

Việc cho phép quyền sở hữu thực sự là -w - wx --- (230)

--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file 

Tuy nhiên, nếu tôi thay đổi 664 thành 0664 trong mã, kết quả chỉ là những gì tôi cần, ví dụ

os.chmod("/tmp/test_file", 0664) 

Kết quả là:

-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file 

Ai có thể giúp giải thích tại sao mà nhập số 0 đầu là rất quan trọng để có được kết quả chính xác không?

+20

Octal. Octal. Octal. –

+0

Gắn cờ cho Unix .. –

+2

Tôi đã mở một vấn đề cho tài liệu python tại http://bugs.python.org/issue25377 vì điều đó phải rõ ràng từ tài liệu. –

Trả lời

73

Các mặt hàng này trên different forum

Nếu bạn đang tự hỏi tại sao điều đó dẫn không là rất quan trọng, đó là vì quyền được thiết lập như một số nguyên bát phân, và Python Automagically xử lý bất kỳ số nguyên với một số không hàng đầu như bát phân. Vì vậy, os.chmod ("tệp", 484) (theo số thập phân) sẽ cho kết quả tương tự.

gì bạn đang làm là đi qua 664 mà trong bát phân là 1230

Trong trường hợp của bạn, bạn sẽ cần

os.chmod("/tmp/test_file", 436) 

[Cập nhật] Lưu ý, đối với Python 3 bạn có tiền tố với 0o (không oh). E.G, 0o666

+0

Cảm ơn, nhưng tôi vẫn còn nhầm lẫn rằng, 484 trong số thập phân có nghĩa là 744 trong bát phân, có ý nghĩa trong chuỗi bạn đã đề cập trong diễn đàn.Tuy nhiên, nếu tôi cung cấp cho 644 trong thập phân, nó đi đến 1204 trong bát phân. Làm thế nào để 1204 liên quan đến 230 trong bát phân? – AplusG

+0

Điều đó đã được chọn đúng nguyên văn từ bài đăng. Tôi đã thêm những gì bạn cần (436) vào phần cuối của câu trả lời – RedBaron

+0

oh..xin lỗi ... sai lầm của tôi ... nhầm lẫn mất 644 cho 664 ... – AplusG

6

hàng đầu "0" có nghĩa là hằng số bát phân, không phải là số thập phân. và bạn cần một bát phân để thay đổi chế độ tệp. Các điều khoản

quyền là mặt nạ bit, ví dụ: rwxrwx --- là 111111000 ở dạng nhị phân và rất dễ dàng để nhóm bit theo 3 để chuyển đổi sang bát phân, so với tính toán biểu diễn thập phân.

0644 (bát phân) là 0.110.100.100 trong nhị phân (tôi đã thêm dấu chấm để dễ đọc), hoặc, như bạn có thể tính, 420 theo thập phân.

76

Vì vậy, đối với những người muốn symantics tương tự như:

$ chmod 755 somefile 

Trong python2:

$ python -c "import os; os.chmod('somefile', 0755)" 

Nhưng trong python3:

$ python3 -c "import os; os.chmod('somefile', 0o755)" 
+6

Định dạng python3 cũng hoạt động trong python 2.7.9. Tôi đã không kiểm tra các phiên bản trước đó. –