web-dev-qa-db-ja.com

python内からのbashスクリプトの実行

次のコードに問題があります。

callBash.py:

import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"

sleep.sh:

sleep 10

「終了」を10秒後に印刷するようにします。 (私はこれが馬鹿げた例であることを知っています、私は単純にPython内で眠ることができましたが、この単純なsleep.shファイルはちょうどテストとしてでした)

78
user1638145

Sleep.shを実行可能にし、パラメータリストにShell=Trueを追加すると(前の回答で提案されたとおり)正常に機能します。検索パスによっては、./または他の適切なパスを追加する必要がある場合もあります。 (つまり、"sleep.sh""./sleep.sh"に変更します。)

Bashスクリプトの最初の行がシェルへのパスである場合、Shell=Trueパラメーターは必要ありません(LinuxなどのPosixシステムの場合)。たとえば、#!/bin/bash

69

実際には、Shell=True引数を追加する必要があります。

subprocess.call("sleep.sh", Shell=True)

しかし、注意してください-

警告信頼されていない入力と組み合わせると、Shell = Trueを使用してシステムシェルを呼び出すことはセキュリティ上の危険になります。詳細については、よく使用される引数の警告を参照してください。

ソース

29
zenpoy

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)
26
jfs

引数を指定してスクリプトを呼び出すを探している場合

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)
8
Ponmudi VN

sleep.shに実行権限があることを確認し、Shell=Trueで実行します。

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", Shell=True)
print "end"
7
Adam Matan

Chmodが機能しない場合は、あなたも試してください

import os
os.system('sh script.sh')
#you can also use bash instead of sh

私のおかげでテスト

4
Harry1992

Pythonからbashスクリプトを実行する方法を尋ねた後、ここに導かれたため、答えを追加します。スクリプトがパラメーターを受け取ると、エラーOSError: [Errno 2] file not foundを受け取ります。たとえば、スクリプトがスリープ時間パラメータを取得したとしましょう:subprocess.call("sleep.sh 10")は機能しません。配列として渡す必要があります:subprocess.call(["sleep.sh", 10])

2
Matthew Lang