次のコードに問題があります。
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
「終了」を10秒後に印刷してほしい。(私はこれが馬鹿げた例であることを知っています、私は単純にpythonの中で眠ることができましたが、この単純なsleep.shファイルは単なるテストでした)
次のコードに問題があります。
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
「終了」を10秒後に印刷してほしい。(私はこれが馬鹿げた例であることを知っています、私は単純にpythonの中で眠ることができましたが、この単純なsleep.shファイルは単なるテストでした)
回答:
sleep.shを実行可能にshell=Trueし、パラメーターリストに追加する(以前の回答で提案されているように)のは問題ありません。検索パスによっては、./その他の適切なパスを追加する必要がある場合もあります。(つまり、に変更"sleep.sh"し"./sleep.sh"ます。)
shell=Truebashスクリプトの最初の行は、シェルへのパスである場合、パラメータは、(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)
にsleep.sh実行権限があることを確認し、次のコマンドで実行しshell=Trueます。
#!/usr/bin/python
import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
#!bin/bashがありません/。 #!/bin/bash私が答えで指摘したように機能します。
私がpythonからbashスクリプトを実行する方法を尋ねた後、ここに誘導されたので、答えを追加します。OSError: [Errno 2] file not foundスクリプトがパラメータを受け取ると、エラーが発生します。たとえば、スクリプトがスリープ時間パラメーターを受け取ったとします。これsubprocess.call("sleep.sh 10")は機能しません。配列として渡す必要があります。subprocess.call(["sleep.sh", 10])
shell=Trueを理解する必要がありますが、はい、通常それを避けることがあなたの最高のプレーです。