139

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

callBash.py:

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

スリープ.sh:

sleep 10

「終了」を10秒後に印刷したい。(これはばかげた例であることはわかっています。Python内で単純にスリープできますが、この単純なsleep.shファイルは単なるテスト用です)

4

7 に答える 7

108

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

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

于 2012-12-06T14:42:00.133 に答える
58

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)
于 2014-03-14T21:35:09.610 に答える
36

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

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

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

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

ソース

于 2012-12-06T14:35:52.480 に答える
15

sleep.shに実行権限があることを確認し、次のように実行しshell=Trueます。

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
于 2012-12-06T14:28:11.053 に答える
3

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

于 2016-11-08T16:04:19.043 に答える