2017/10/24

Python Tips:Python でファイルに権限を追加したい

Python でファイルに権限を追加する方法について見てみます。

イメージとしては、次のコマンドと同等の処理を Python で行うイメージです。

$ chmod u+w target_file


まず、ファイルの権限を指定する方法についてですが、 Python では os.chmod()pathlib.Path.chmod() を使ってファイルの権限を設定することができます。

os.chmod — Python documentation
pathlib.Path.chmod — Python documentation

一方、ファイルの権限の取得は os.stat()pathlib.Path.stat() で行うことができます。

os.stat — Python documentation
pathlib.Path.stat — Python documentation

また、各権限を表すフラグとして次の定数が用意されています。

# read (読み込み):
# stat.S_IRUSR  256
# stat.S_IRGRP   32
# stat.S_IROTH    4

# write (書き込み):
# stat.S_IWUSR  128
# stat.S_IWGRP   16
# stat.S_IWOTH    2

# execute (実行):
# stat.S_IXUSR   64
# stat.S_IXGRP    8
# stat.S_IXOTH    1

stat — Python documentation

ファイルの権限の追加(や削除)はこれらを組み合わせて行うことになります。
たとえば、書き込み権限を付与する関数 add_write_permission() は次のように書くことができます。

# coding:  utf-8

'''Provides functions to add permissions to files.
'''

import stat
from pathlib import Path
from functools import reduce


def add_write_permission(path: Path, target='u'):
    '''Add "write" permission to specified targets.
    '''
    mode_map = {
        'u': stat.S_IWUSR,
        'g': stat.S_IWGRP,
        'o': stat.S_IWOTH,
        'a': stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH,
    }

    mode_additional = combine_permissions(target, mode_map)

    path.chmod(path.stat().st_mode | mode_additional)


def combine_permissions(target, mode_map):
    modes = map(lambda x: mode_map[x], target)
    return reduce(lambda x, y: x | y, modes)

次のように利用します。

add_write_permission(Path('sample-1.txt'), 'ug')
add_write_permission(Path('sample-2.txt'), 'a')

書き込み権限、実行権限についても追加することができます。
GitHub Gist に書き込み権限、実行権限を付与するための関数も含めたサンプルをあげているので、興味のある方は参考にしてみてください。



Functions to add file permissions with Python. · GitHub

0 件のコメント: