在Python中运行bash脚本

我有以下代码的问题:

callBash.py:

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

sleep.sh:

 sleep 10 

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

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

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

其实,你只需要添加shell=True参数:

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

但要小心 –

警告如果与不可信input结合使用,调用shell = True的系统shell可能会带来安全隐患。 有关详细信息,请参阅常用参数下的警告。

资源

如果sleep.sh具有shebang #!/bin/sh并且具有适当的文件许可权 – 运行chmod u+rx sleep.sh以确保它在$PATH那么代码应该按原样运行:

 import subprocess rc = subprocess.call("sleep.sh") 

如果脚本不在PATH中,那么指定它的完整path,例如,如果它在当前工作目录中:

 from subprocess import call rc = call("./sleep.sh") 

如果脚本没有shebang,那么你需要指定shell=True

 rc = call("./sleep.sh", shell=True) 

如果脚本没有可执行权限,并且不能修改它,例如通过运行os.chmod('sleep.sh', 0o755)那么你可以将脚本作为文本文件读取,并将string传递给subprocess模块:

 with open('sleep.sh', 'rb') as file: script = file.read() rc = call(script, shell=True) 

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

 #!/usr/bin/python import subprocess print "start" subprocess.call("./sleep.sh", shell=True) print "end" 

添加一个答案,因为我问这个问题后,如何从Python运行一个bash脚本。 如果您的脚本需要参数,则会收到错误的OSError: [Errno 2] file not found 。 比方说,你的脚本在睡眠时间参数: subprocess.call("sleep.sh 10")将无法正常工作,您必须将其作为一个数组传递: subprocess.call(["sleep.sh", 10])