답변:
사용하여 os.stat()
현재 권한을 사용 얻기 위해 |
함께 또는 비트를, 사용은 os.chmod()
업데이트 된 권한을 설정할 수 있습니다.
예:
import os
import stat
st = os.stat('somefile')
os.chmod('somefile', st.st_mode | stat.S_IEXEC)
STAT_OWNER_EXECUTABLE = stat.S_IEXEC
없는 것 대신 사람이 읽을 수있는 지역 상수를 사용합니다.
subprocess.check_call(['chmod', '+x', 'somefile'])
그리고 a+rx
.
실행 파일 (예 : 스크립트)을 생성하는 도구의 경우 다음 코드가 도움이 될 수 있습니다.
def make_executable(path):
mode = os.stat(path).st_mode
mode |= (mode & 0o444) >> 2 # copy R bits to X
os.chmod(path, mode)
이것은 umask
파일이 생성되었을 때 유효했던 것을 (다소 또는 덜) 존중하게 만듭니다 . 실행 파일은 읽을 수있는 사람에 대해서만 설정됩니다.
용법:
path = 'foo.sh'
with open(path, 'w') as f: # umask in effect when file is created
f.write('#!/bin/sh\n')
f.write('echo "hello world"\n')
make_executable(path)
0444
, 당신은 사용하십시오 0o444
. 또는 둘 다 지원하려면 292
.
당신은 또한 이것을 할 수 있습니다
>>> import os
>>> st = os.stat("hello.txt")
현재 파일 목록
$ ls -l hello.txt
-rw-r--r-- 1 morrison staff 17 Jan 13 2014 hello.txt
이제 이것을하십시오.
>>> os.chmod("hello.txt", st.st_mode | 0o111)
터미널에서 볼 수 있습니다.
ls -l hello.txt
-rwxr-xr-x 1 morrison staff 17 Jan 13 2014 hello.txt
비트 단위로 또는 0o111을 사용하여 모든 실행 가능하게 만들고 0o222를 사용하여 모두 쓰기 가능하게 만들고 0o444를 사용하여 모두 읽기 가능하게 만들 수 있습니다.
존경 umask
하는chmod +x
man chmod
augo
다음과 같이 주어지지 않으면 다음과 같이 말합니다 .
chmod +x mypath
그런 다음 a
사용되지만 다음 과 함께 사용됩니다 umask
.
ugoa 문자의 조합은 파일을 소유 한 사용자 (u), 파일 그룹의 다른 사용자 (g), 파일 그룹에없는 다른 사용자 (o) 또는 모든 사용자의 파일 액세스를 제어합니다. 사용자 (a). 이들 중 아무것도 제공되지 않으면 효과는 (a)가 제공된 것처럼 보이지만 umask에 설정된 비트는 영향을받지 않습니다.
다음은 해당 동작을 정확하게 시뮬레이션하는 버전입니다.
#!/usr/bin/env python3
import os
import stat
def get_umask():
umask = os.umask(0)
os.umask(umask)
return umask
def chmod_plus_x(path):
os.chmod(
path,
os.stat(path).st_mode |
(
(
stat.S_IXUSR |
stat.S_IXGRP |
stat.S_IXOTH
)
& ~get_umask()
)
)
chmod_plus_x('.gitignore')
참고 항목 : Python에서 기본 파일 권한을 얻으려면 어떻게해야합니까?
Ubuntu 16.04, Python 3.5.2에서 테스트되었습니다.
python3에서 :
import os
os.chmod("somefile", 0o664)
0o
권한이 8 진 정수로 설정되고 Python은 선행 0이있는 모든 정수를 8 진수로 자동 처리 하므로 접두사 를 추가해야합니다 . 그렇지 않으면 os.chmod("somefile", 1230)
실제로 통과 하고 있으며 이는 664
.
chmod +
기존 권한에 새 권한을 추가해야하는 OP에서 요청한대로 수행하지 않습니다 .