次のコードに問題があります。
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
スリープ.sh:
sleep 10
「終了」を10秒後に印刷したい。(これはばかげた例であることはわかっています。Python内で単純にスリープできますが、この単純なsleep.shファイルは単なるテスト用です)
sleep.shを実行可能にshell=True
し、(前の回答で提案されているように)パラメーターリストに追加することは問題なく機能します。検索パスによっては、./
またはその他の適切なパスを追加する必要がある場合もあります。(つまり、に変更"sleep.sh"
し"./sleep.sh"
ます。)
bashスクリプトのshell=True
最初の行がシェルへのパスである場合、パラメーターは必要ありません(LinuxなどのPosixシステムでは)。たとえば、#!/bin/bash
。
sleep.sh
シバンが#!/bin/sh
あり、適切なファイル権限がある場合-実行chmod u+rx sleep.sh
して確認し、それが入っている$PATH
場合、コードはそのまま動作するはずです:
import subprocess
rc = subprocess.call("sleep.sh")
スクリプトが PATH にない場合は、フル パスを指定します。たとえば、現在の作業ディレクトリにある場合は次のようになります。
from subprocess import call
rc = call("./sleep.sh")
スクリプトにシバンがない場合は、次を指定する必要がありますshell=True
。
rc = call("./sleep.sh", shell=True)
スクリプトに実行権限がなく、たとえば実行によって変更できない場合はos.chmod('sleep.sh', 0o755)
、スクリプトをテキスト ファイルとして読み取り、subprocess
代わりに文字列をモジュールに渡すことができます。
with open('sleep.sh', 'rb') as file:
script = file.read()
rc = call(script, shell=True)
shell=True
実際には、引数を追加するだけです:
subprocess.call("sleep.sh", shell=True)
しかし、注意してください -
警告 shell=True を指定してシステム シェルを呼び出すと、信頼できない入力と組み合わせると、セキュリティ上の危険が生じる可能性があります。詳細については、よく使用される引数の警告を参照してください。
sleep.sh
に実行権限があることを確認し、次のように実行しshell=True
ます。
#!/usr/bin/python
import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
Pythonからbashスクリプトを実行する方法を尋ねた後、ここに誘導されたため、回答を追加します。OSError: [Errno 2] file not found
スクリプトがパラメーターを受け取ると、エラーが発生します。たとえば、スクリプトがスリープ時間パラメーターを取り込んだとしましょsubprocess.call("sleep.sh 10")
う。機能しないため、配列として渡す必要があります。subprocess.call(["sleep.sh", 10])