从python中运行bash脚本

时间:2012-12-06 14:25:17

标签: python bash call

我遇到以下代码的问题:

callBash.py:

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

sleep.sh:

sleep 10

我想在10秒后打印“结束”。 (我知道这是一个愚蠢的例子,我可以简单地在python中睡觉,但这个简单的sleep.sh文件只是作为测试)

7 个答案:

答案 0 :(得分:67)

使sleep.sh可执行文件并将shell=True添加到参数列表(如前面的答案所示)可以正常工作。根据搜索路径,您可能还需要添加./或其他一些适当的路径。 (即,将"sleep.sh"更改为"./sleep.sh"。)

如果bash脚本的第一行是shell的路径,则不需要shell=True参数(在像Linux这样的Posix系统下);例如,#!/bin/bash

答案 1 :(得分:29)

实际上,您只需要添加shell=True参数:

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

但要注意 -

  

警告如果与不受信任的输入结合使用,则使用shell = True调用系统shell可能会造成安全隐患。有关详细信息,请参阅“常用参数”下的警告。

source

答案 2 :(得分:26)

如果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")

如果脚本没有shebang,那么您需要指定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)

答案 3 :(得分:6)

确保sleep.sh具有执行权限,并使用shell=True运行它:

#!/usr/bin/python

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

答案 4 :(得分:6)

如果有人在寻找使用参数调用脚本

import subprocess

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

记得在传递之前使用str(arg)将args转换为字符串。

这可用于传递所需数量的参数

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

答案 5 :(得分:4)

如果chmod不工作,那么你也试试

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

由我测试,谢谢

答案 6 :(得分:2)

添加答案,因为我在询问如何从python运行bash脚本后被引导到这里。如果您的脚本接收参数,则会收到错误OSError: [Errno 2] file not found。让我们假设您的脚本占用了一个睡眠时间参数:subprocess.call("sleep.sh 10")无效,您必须将其作为数组传递:subprocess.call(["sleep.sh", 10])