Python 모듈 os.chmod (file, 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으로 그룹화하여 8 진수로 변환하는 것이 매우 쉽습니다.
0644 (8 진수)는 이진수로 0.110.100.100 (가독성을 위해 점을 추가했습니다) 또는 계산할 수 있듯이 10 진수로 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_IWRITE
및stat.S_IREAD
상수 또는 해당 정수 값을 통해) 설정할 수만 있습니다 . 다른 모든 비트는 무시됩니다.
chmod +x
다음에서 시연됩니다. 파이썬 내에서 간단한 "chmod + x"를 어떻게 수행합니까?
Ubuntu 16.04, Python 3.5.2에서 테스트되었습니다.
'development' 카테고리의 다른 글
효율적인 순환 버퍼? (0) | 2020.08.24 |
---|---|
VBA-for 루프 반복을 조건부로 건너 뛰는 방법 (0) | 2020.08.24 |
dplyr을 사용하여 각 그룹에서 최대 값을 가진 행을 선택하는 방법은 무엇입니까? (0) | 2020.08.24 |
jQuery-잘못된 호출 (0) | 2020.08.24 |
Stackpanel에 ScrollBar를 추가하는 방법 (0) | 2020.08.24 |