次のコードに問題があります。
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"
に変更します。)
Bashスクリプトの最初の行がシェルへのパスである場合、Shell=True
パラメーターは必要ありません(LinuxなどのPosixシステムの場合)。たとえば、#!/bin/bash
。
実際には、Shell=True
引数を追加する必要があります。
subprocess.call("sleep.sh", Shell=True)
しかし、注意してください-
警告信頼されていない入力と組み合わせると、Shell = Trueを使用してシステムシェルを呼び出すことはセキュリティ上の危険になります。詳細については、よく使用される引数の警告を参照してください。
sleep.sh
にShebang #!/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)
引数を指定してスクリプトを呼び出すを探している場合
import subprocess
val = subprocess.check_call("./script.sh '%s'" % arg, Shell=True)
str(arg)を使用して、渡す前に引数を文字列に変換することを忘れないでください。
これを使用して、必要な数の引数を渡すことができます
subprocess.check_call("./script.ksh %s %s %s" % (agr1, str(arg2), arg3), Shell=True)
sleep.sh
に実行権限があることを確認し、Shell=True
で実行します。
#!/usr/bin/python
import subprocess
print "start"
subprocess.call("./sleep.sh", Shell=True)
print "end"
Chmodが機能しない場合は、あなたも試してください
import os
os.system('sh script.sh')
#you can also use bash instead of sh
私のおかげでテスト
Pythonからbashスクリプトを実行する方法を尋ねた後、ここに導かれたため、答えを追加します。スクリプトがパラメーターを受け取ると、エラーOSError: [Errno 2] file not found
を受け取ります。たとえば、スクリプトがスリープ時間パラメータを取得したとしましょう:subprocess.call("sleep.sh 10")
は機能しません。配列として渡す必要があります:subprocess.call(["sleep.sh", 10])