我有一个python脚本,它应该执行一个shell脚本。但它应该在执行前睡30秒。我希望脚本在后台睡眠然后执行它。
Shell命令应该是这样的: 如果我直接在控制台上输入此命令,则可以正常工作。
(sleep 30 && /root/bin/myscript.sh parameter1 parameter2) > /dev/null 2>&1
现在来自python :(我已将命令分开)
subprocess.call(['/bin/sleep', '30', '&'])
subprocess.call(['/root/bin/myscript.sh', str(dom), str(limit), '&'])
(str(dom)和str(limit)是2个参数)
我收到此错误:
/bin/sleep: invalid time interval `&'
为什么&
作为参数而不是30?
答案 0 :(得分:3)
错误是因为&
作为参数传递给/bin/sleep
命令,而您在告诉shell在后台执行命令的上下文中使用它。
如果您想使用'&'或'&&'你可以使用os.system
:
os.system('sleep 1 && echo foo && sleep 5 && echo bar')
或要运行非阻止(在后台)您可以使用标准&
:
os.system('sleep 1 && echo foo && sleep 5 && echo bar &')
答案 1 :(得分:1)
你无法做你想做的事情,强迫python脚本每次都在后台运行。 Python也无法直接在后台运行任务。您可以查看Threading,这可能会达到您想要的效果,但不知道为什么要返回命令提示符,这很困难。我认为你可能想要的是一个专门的线程计时器,可以找到一个例子here。
from threading import Timer
def hello():
print "hello, world"
t = Timer(30.0, hello)
t.start() # after 30 seconds, "hello, world" will be printed
答案 2 :(得分:1)
使用一个字符串调用:
prc = subprocess.Popen('/bin/sleep 3; echo Some string', shell=True)
注意,我删除&
。
答案 3 :(得分:1)
怎么样
subprocess.Popen(["sh","-c","sleep 30; /root/bin/myscript.sh parameter1 parameter2"])
您可以使用字符串连接为parameter1,parameter2构建命令行。
但正如PearsonArtPhoto的回答所述,使用线程是更好的选择。