Python 모듈 os.chmod (파일, 664)는 권한을 rw-rw-r로 변경하지 않지만 -w--wx ----


111

최근에 Python 모듈 os를 사용하고 있는데 파일의 권한을 변경하려고 할 때 예상 한 결과를 얻지 못했습니다. 예를 들어 권한을 rw-rw-r--로 변경하려고했습니다.

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

소유권 권한은 실제로 -w--wx --- (230)입니다.

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

그러나 코드에서 664를 0664로 변경하면 결과는 내가 필요한 것입니다.

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

결과는 다음과 같습니다.

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

아무도 올바른 결과를 얻기 위해 선행 0이 왜 그렇게 중요한지 설명하는 데 도움을 줄 수 있습니까?


33
8 진법. 8 진법. 8 진법.
Cole Johnson

6
문서에서 명확해야하므로 bugs.python.org/issue25377 에서 파이썬 문서에 대한 문제를 열었습니다 .
Karl Richter

답변:


130

다른 포럼 에서 찾았습니다.

선행 0이 왜 중요한지 궁금하다면 권한이 8 진수 정수로 설정되어 있고 Python은 선행 0이있는 모든 정수를 8 진수로 자동 처리하기 때문입니다. 따라서 os.chmod ( "file", 484) (십진수)는 동일한 결과를 제공합니다.

당신이하고 664있는 것은 8 진수로 통과 하는 것입니다.1230

귀하의 경우에는

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

[업데이트] 참고, Python 3의 경우 접두사 0o (zero oh)가 있습니다. EG,0o666


1
고마워요.하지만 여전히 혼란 스럽습니다. 10 진수 484는 8 진수 744를 의미합니다. 포럼에서 언급 한 스레드에서 의미가 있습니다. 그러나 십진수로 644를 주면 8 진수로 1204가됩니다. 1204는 8 진수 230과 어떤 관련이 있습니까?
AplusG 2013 년

2
@AplusG 다음 1되어 있지 버려! 그것은 sticky / setuid / setgid 비트이고 1은 sticky. 사용 ls -l권한을 확인할 수 있습니다 것은 지금 포함 T결국 ...
MestreLion

2
더 쉽게 0을 추가하고 8 진수로 만듭니다. :)
radtek 2014

10
Python 3의 경우 접두사가 0o (zero oh)입니다.
Mawg는 분석 재개 모니카 말한다

1
저는 파이썬 2.7.10에서 0o를 사용합니다
Wyrmwood 2015 년

125

따라서 다음과 유사한 의미를 원하는 사람들을 위해 :

$ chmod 755 somefile

사용하다:

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

Python이 2.6보다 오래된 경우 :

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

12
python3 형식은 python 2.7.9에서도 작동합니다. 이전 버전을 확인하지 않았습니다.
Fred Mitchell

3
파이썬 3 구문은 파이썬에 다시 2.6 작동 docs.python.org/3/whatsnew/...
피트

나를 위해 일하십시오 tks!
LandiLeite

00755나중에 일부 개발자가이 오래된 스크립트를 사용하도록 만들고자하는 경우 (예 : sgid를 사용 2755했지만 그 이유를 알 수없는 경우) suid / sgid / sticky 비트가 어디로 가는지 명확히하기 위해 이어야 합니다. 파마가 완전히 망가졌습니다. ;)
dannysauer

10

선행 0은 이것이 10 진수가 아니라 8 진수 상수 임을 의미합니다 . 파일 모드를 변경하려면 8 진수가 필요합니다.

권한은 비트 마스크가, 예를 들면,이다 rwxrwx---111111000이진, 그것은 소수점 표현을 계산하기보다는 진수로 변환하여 그룹 3 비트 매우 쉽다.

0644(8 진수)는 0.110.100.100이진수 (가독성을 위해 점을 추가했습니다) 또는 계산할 수 있듯이 420십진수입니다.


5

숫자 대신 권한 기호 사용

예를 들어 다음과 664같이 원시 매직 넘버 대신 의미 론적으로 명명 된 권한 기호를 사용했다면 문제가 발생하지 않았을 것입니다 .

#!/usr/bin/env python3

import os
import stat

os.chmod(
    'myfile',
    stat.S_IRUSR |
    stat.S_IWUSR |
    stat.S_IRGRP |
    stat.S_IWGRP |
    stat.S_IROTH
)

이것은 https://docs.python.org/3/library/os.html#os.chmod에 문서화되어 있으며 이름은에 문서화 된 POSIX C API 값 과 동일합니다 man 2 stat.

또 다른 장점은 문서에 언급 된대로 더 큰 이식성입니다.

참고 : Windows에서를 지원하지만 chmod()파일의 읽기 전용 플래그를 ( stat.S_IWRITEstat.S_IREAD상수 또는 해당 정수 값을 통해) 설정할 수만 있습니다 . 다른 모든 비트는 무시됩니다.

chmod +x다음에서 시연됩니다. 파이썬 내에서 간단한 "chmod + x"를 어떻게 수행합니까?

Ubuntu 16.04, Python 3.5.2에서 테스트되었습니다.


1
이것이 문제를 해결하는 올바른 방법입니다.
carthurs

나는 이것을 파이썬 방식으로 알고 있지만 그것은 거의 추악 할 수 없다 :)
Tomasz Swider

2

원하는 권한이 문자열에 저장된 경우 다음을 수행하십시오.

s = '660'
os.chmod(file_path, int(s, base=8))

0

stat. * 비트 마스크를 사용하는 것이이 작업을 수행하는 가장 이식 가능하고 명시적인 방법 인 것 같습니다. 그러나 다른 한편으로 나는 그것을 처리하는 가장 좋은 방법을 종종 잊어 버립니다. 따라서 다음은 '그룹'및 '기타'권한을 마스킹하고 '소유자'권한을 그대로 두는 예입니다. 비트 마스크와 빼기를 사용하는 것은 유용한 패턴입니다.

import os
import stat
def chmodme(pn):
    """Removes 'group' and 'other' perms. Doesn't touch 'owner' perms."""
    mode = os.stat(pn).st_mode
    mode -= (mode & (stat.S_IRWXG | stat.S_IRWXO))
    os.chmod(pn, mode)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.