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