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

최근에 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이 왜 그렇게 중요한지 설명하는 데 도움을 줄 수 있습니까?



답변

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

선행 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


답변

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

$ chmod 755 somefile

사용하다:

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

Python이 2.6보다 오래된 경우 :

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


답변

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

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

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


답변

숫자 대신 권한 기호 사용

예를 들어 다음과 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에서 테스트되었습니다.


답변

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

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


답변

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)


답변