programing

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

nasanasas 2020. 8. 16. 20:46
반응형

파이썬 내에서 간단한“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.

A combination of the letters ugoa controls which users' access to the file will be changed: the user who owns it (u), other users in the file's group (g), other users not in the file's group (o), or all users (a). If none of these are given, the effect is as if (a) were given, but bits that are set in the umask are not affected.

Here is a version that simulates that behavior exactly:

#!/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')

See also: How can I get the default file permissions in Python?

Tested in Ubuntu 16.04, Python 3.5.2.


In python3:

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

Remember to add the 0o prefix since permissions are set as an octal integer, and Python automatically treats any integer with a leading zero as octal. Otherwise, you are passing os.chmod("somefile", 1230) indeed, which is octal of 664.


If you're using Python 3.4+, you can use the standard library's convenient pathlib.

Its Path class has built-in chmod and stat methods.

from pathlib import Path


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

참고URL : https://stackoverflow.com/questions/12791997/how-do-you-do-a-simple-chmod-x-from-within-python

반응형