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


119

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

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

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

답변:


197

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

예:

import os
import stat

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

2
이것은 사용자에 의해서만 실행 가능하게합니다. 포스터는 전반적으로는 실행한다 "chmod를 + X"에 대해 질문했다 (사용자, 그룹, 세계)
eric.frederich

35
다음을 사용하여 모든 사람이 실행할 수 있도록합니다 ... stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH. 참고 :이 값은 8 진수 0111과 동일하므로 st.st_mode | 0111
eric.frederich 2013-08-13

1
아래의 내 대답 은 컴파일러에서 기대할 수 있듯이 R 비트를 X로 복사합니다.
Jonathon Reinhart 2015 년

나는 할 것이고 의미 STAT_OWNER_EXECUTABLE = stat.S_IEXEC없는 것 대신 사람이 읽을 수있는 지역 상수를 사용합니다.
ThorSummoner

여기에 좀 더 읽기 쉬운 비 파이썬 답이 있습니다 : subprocess.check_call(['chmod', '+x', 'somefile'])그리고 a+rx.
Trevor Boyd Smith

20

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

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
대신 파이썬 3. 변경 진수 리터럴은 0444, 당신은 사용하십시오 0o444. 또는 둘 다 지원하려면 292.
Kevin

1
그것은 @Kevin 과 같은 새로운 구문이 파이썬 2.6에서 지원하고있다, 그래서 그것을 사용하는 것이 합리적인 것 같다. (호환성 참조 포인트를 위해 CentOS 6에는 Python 2.6이 함께 제공됩니다.)
Jonathon Reinhart

2
나는 파이썬 3가 전통적인 8 진 리터럴을 제거했다는 것을 알지 못했습니다. 그래서 감사합니다.
조나단 라인 하트

12

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

파이썬 2 :

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

파이썬 3 :

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

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

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

참조 권한 예


4
이것은 os.chmod ( "/ somedir / somefile", 0o775)이어야합니다
ang mo

4

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

>>> 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를 사용하여 모두 읽기 가능하게 만들 수 있습니다.


2

존경 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에서 테스트되었습니다.


1

python3에서 :

import os
os.chmod("somefile", 0o664)

0o권한이 8 진 정수로 설정되고 Python은 선행 0이있는 모든 정수를 8 진수로 자동 처리 하므로 접두사 를 추가해야합니다 . 그렇지 않으면 os.chmod("somefile", 1230)실제로 통과 하고 있으며 이는 664.


1
이것은 권한을 절대 값으로 설정하고, chmod +기존 권한에 새 권한을 추가해야하는 OP에서 요청한대로 수행하지 않습니다 .
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

0

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

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

from pathlib import Path


f = Path("/path/to/file.txt")
f.chmod(f.stat().st_mode | stat.S_IEXEC)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.