次のコードに問題があります。
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=True
bashスクリプトの最初の行は、シェルへのパスである場合、パラメータは、(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
を理解する必要がありますが、はい、通常それを避けることがあなたの最高のプレーです。