在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])