Python内からbashスクリプトを実行する


104

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

callBash.py:

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

sleep.sh:

sleep 10

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


「$!bin / bash; sleep 10;」でも試してみました
user1638145

この質問者がどのような問題を尋ねようとしているのかは不明ですが、多かれ少なかれ良い答えの歴史的なグラブバッグが答えとして蓄積されているため、問題はおそらく残るはずです。おそらく、特定のエラーを検索するか、stackoverflow.com
4256107

回答:


90

sleep.shを実行可能にshell=Trueし、パラメーターリストに追加する(以前の回答で提案されているように)のは問題ありません。検索パスによっては、./その他の適切なパスを追加する必要がある場合もあります。(つまり、に変更"sleep.sh""./sleep.sh"ます。)

shell=Truebashスクリプトの最初の行は、シェルへのパスである場合、パラメータは、(LinuxのようなのPosixシステムの下で)必要とされません。例えば、#!/bin/bash


47

場合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)

33

実際には、shell=True引数を追加するだけです。

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

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

警告信頼できない入力と組み合わせた場合、shell = Trueでシステムシェルを呼び出すと、セキュリティ上の問題が発生する可能性があります。詳細については、よく使用される引数の警告を参照してください。

ソース


1
にない場合sleep.shは機能しませんPATH。そして、それパスにあり、それが正しいシバンを持っているなら、あなたは必要ありませんshell=True私の答えを
jfs

16

誰かが引数付きのスクリプトを呼び出すことを探している場合

import subprocess

val = subprocess.check_call("./script.sh '%s'" % arg, shell=True)

str(arg)を使用して、渡す前に引数を文字列に変換することを忘れないでください。

これを使用して、必要な数の引数を渡すことができます。

subprocess.check_call("./script.ksh %s %s %s" % (arg1, str(arg2), arg3), shell=True)

10

sleep.sh実行権限があることを確認し、次のコマンドで実行しshell=Trueます。

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"

それで私は見逃したshell = Trueでした。sh scricptの最初の行に#!bin / bashを設定するだけでは不十分な理由を説明してください。
user1638145

3
のエラーは#!bin/bashがありません/#!/bin/bash私が答えで指摘したように機能します。
James Waldby-jwpat7

9

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

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

私によるテストありがとう


os.systemドキュメントには、具体的に賛成して、それを避けることをお勧めしますsubprocess(これらの日subprocess.run())。subprocess仕事に行けない場合は、問題が発生する可能性がありますos.system()
トリプルリー

3

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


あなたはの実際の意味shell=Trueを理解する必要がありますが、はい、通常それを避けることがあなたの最高のプレーです。
トリプルリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.