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

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

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

$ chmod u+w target_file

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

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

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

# 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

ファイルの権限の追加(や削除)はこれらを組み合わせて行うことになります。 たとえば、書き込み権限を付与する関数 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 に書き込み権限、実行権限を付与するための関数も含めたサンプルをあげているので、興味のある方は参考にしてみてください。