実行する前に、次を使用して、ターミナルシェルからいつでもこれを行うことができますchmod
。
chmod a+x my_script.sh
Python から実行する場合は、モジュール内でchmod
またはを使用できます。すでにファイルを開いているので、後者を行います。fchmod
os
with open("my_script.sh", "w") as fd:
fd.write("#!/bin/sh\n")
fd.write("echo $PATH\n")
os.fchmod(fd.fileno(), stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH | stat.S_IXOTH)
残念ながら、ご覧のとおり、すべての人にフラグをchmod a+x
追加して、他のすべてをそのままにしておくことに直接相当するものはありません。ただし、コマンドライン ツールが実際にx
行うのと同じことを行うことができます。つまり、ファイル (この場合は) で既存のアクセス許可を取得してから、それらを変更します。chmod
stat
fstat
with open("my_script.sh", "w") as fd:
fd.write("#!/bin/sh\n")
fd.write("echo $PATH\n")
mode = os.fstat(fd.fileno()).st_mode
mode |= stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
os.fchmod(fd.fileno(), stat.S_IMODE(mode))
S_IMODE
(ほとんどのプラットフォームでは実際にはこのステップは必要ありst_mode
ません。余分なビットがないか、(f) chmod
OS X のように無害に無視するためです。しかし、正しいことを行い、コードを移植可能にする方がよいでしょう。そして将来性があります。)
ほとんどの人は、「フレンドリーな」名前S_IXUSR
は特にフレンドリーではないと考えています。モードを 8 進法で考えるようになると、POSIX での省略形を覚えようとするよりも実際には簡単になるため、次のようにすることをお勧めします。
with open("my_script.sh", "w") as fd:
fd.write("#!/bin/sh\n")
fd.write("echo $PATH\n")
mode = os.fstat(fd.fileno()).st_mode
mode |= 0o111
os.fchmod(fd.fileno(), mode & 0o7777)
111
ユーザー、グループ、およびその他によって実行可能な手段 (さまざまなビットと同じこと)|
でST_IX*
あり、7777
(f) に渡すことが許可されているすべてのビットですchmod
(同じことS_IMODE
)。