回答:
使用os.stat()
現在のアクセス権、使用取得するために|
、一緒にまたはビットを、および使用はos.chmod()
、更新権限を設定します。
例:
import os
import stat
st = os.stat('somefile')
os.chmod('somefile', st.st_mode | stat.S_IEXEC)
STAT_OWNER_EXECUTABLE = stat.S_IEXEC
、意味不明なものではなく、人間が読めるローカル定数を使用します。
subprocess.check_call(['chmod', '+x', 'somefile'])
そして、のような操作をより簡単に実行しましょうa+rx
。
実行可能ファイル(スクリプトなど)を生成するツールの場合、次のコードが役立つ場合があります。
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)
0444
使用します0o444
。または、両方をサポートしたい場合は、と書いてください292
。
これもできます
>>> 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 chmod
次のようにaugo
指定されていない場合、
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でテスト済み。
python3の場合:
import os
os.chmod("somefile", 0o664)
0o
許可は8進整数として設定されるため、接頭辞を追加することを忘れないでください。Pythonは、先頭にゼロがある整数を8進として自動的に扱います。それ以外の場合は、os.chmod("somefile", 1230)
実際に渡されます664
。これはの8進数です。
chmod +
既存のアクセス許可に新しいアクセス許可を追加する必要があるOPからの要求には応じません。