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 に書き込み権限、実行権限を付与するための関数も含めたサンプルをあげているので、興味のある方は参考にしてみてください。