[python] 파이썬 내에서 간단한“chmod + x”를 어떻게 수행합니까?

실행 가능한 Python 스크립트 내에서 파일을 만들고 싶습니다.

import os
import stat
os.chmod('somefile', stat.S_IEXEC)

os.chmod유닉스 chmod처럼 권한을 ‘추가’하지 않는 것 같습니다 . 마지막 줄을 주석 처리하면 파일에 filemode가 있고 -rw-r--r--주석 처리되지 않은 파일 모드는 ---x------. u+x나머지 모드는 그대로 유지하면서 플래그를 추가하려면 어떻게 해야합니까?



답변

사용하여 os.stat()현재 권한을 사용 얻기 위해 |함께 또는 비트를, 사용은 os.chmod()업데이트 된 권한을 설정할 수 있습니다.

예:

import os
import stat

st = os.stat('somefile')
os.chmod('somefile', st.st_mode | stat.S_IEXEC)


답변

실행 파일 (예 : 스크립트)을 생성하는 도구의 경우 다음 코드가 도움이 될 수 있습니다.

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)


답변

원하는 권한을 알고 있다면 다음 예제를 통해 간단하게 유지할 수 있습니다.

파이썬 2 :

os.chmod("/somedir/somefile", 0775)

파이썬 3 :

os.chmod("/somedir/somefile", 0o775)

다음 중 하나와 호환 가능 (8 진 변환) :

os.chmod("/somedir/somefile", 509)

참조 권한 예


답변

당신은 또한 이것을 할 수 있습니다

>>> 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 chmodaugo다음과 같이 주어지지 않으면 다음과 같이 말합니다 .

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.


답변

Python 3.4 이상을 사용하는 경우 표준 라이브러리의 편리한 pathlib를 사용할 수 있습니다 .

경로 클래스는 내장 된 chmod를 하고 통계 방법.

from pathlib import Path


f = Path("/path/to/file.txt")
f.chmod(f.stat().st_mode | stat.S_IEXEC)