2012-12-31 10 views
10

Mac OS上でpythonを使用して、書き込み用のファイルを開き、その中にいくつかのシェルコマンドを入れたいと思います。後でターミナルで走る。Pythonを使用してファイルの実行ビットを設定する

with open("my_script.sh", "w") as fd: 
    fd.write("#!/bin/sh\n") 
    fd.write("echo $PATH\n") 

私はターミナルでそれを実行したときに、私が取得することはできません。これは、ファイルを作成しますが、私はそう実行ビットを設定する方法を見つけ出すことができませんでした:

sh: my_script.sh: Permission denied 
+0

サブプロセスを使用してファイルへの適切なアクセス許可を設定する - http://docs.python.org/2/library/subprocess.html – theharshest

+0

@theharshest: 'サブプロセス 'でどのようにしますか? (check_call(['chmod '、' a + x '、' myscript.sh ']) 'と同じ方法で' check_call([' echo '、' foo ']) 'を実行することができますあなたが本当にしたい場合は 'print( 'foo')'の、なぜ...?) – abarnert

答えて

18
import os 
os.chmod("my_script.sh", 0744) 

は、値を選択してください適切に。一部の値は安全でない場合があります。

+0

それは動作します - ありがとう。 –

+4

Python 3との互換性のために '0o744'を使う必要があります。 – asmeurer

10

あなたはいつもchmodを使用して、それを実行する前に、ターミナルのシェルからこれを行うことができます。

chmod a+x my_script.sh 

あなたは、Pythonからそれを実行したい場合は、あなたがosモジュールにchmodまたはfchmodのいずれかを使用することができます。すでにファイルオープンを持っているので、私は後者にしてください:あなたが見ることができるよう

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) 

残念ながら、単独で、他のすべてを残しながら、皆のためxフラグを追加chmod a+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)) 

(あなたがいませんst_modeに余分なビットがないか、または(f)chmodが無害に無視されるため、ほとんどのプラットフォームでS_IMODEステップが実際に必要です(OS Xのように無害に無視します)。

ほとんどの人は、フレンドリーな名前をS_IXUSRのように特に親切ではないと考えていますが、 (同じ

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は、ユーザー、グループ、およびその他によって実行意味:あなたはオクタル面でのモードを考えることを学ぶたら、それはPOSIXは物事を略記する方法を覚えしようとするよりも、実際に簡単ですので、あなたはこれを好むことそのようなものはST_IX*ビットのビットの|)、そして7777は、(f)chmod(これはS_IMODEと同じもの)に渡すことができます。

関連する問題