Python 使用子进程延迟执行命令

Python 使用子进程延迟执行命令,python,Python,我正在尝试使用子流程从python脚本执行此命令:sleep 10&&sudo/etc/init.d/tractor-blade restart& 我希望python脚本完成(返回代码0)。然后,10秒钟后,我希望命令得到执行 这就是我所拥有的: import sys, subprocess command = ['sleep', '10', '&&', 'sudo', '/etc/init.d/tractor-blade', 'restart' '&'] p = sub

我正在尝试使用子流程从python脚本执行此命令:
sleep 10&&sudo/etc/init.d/tractor-blade restart&

我希望python脚本完成(返回代码0)。然后,10秒钟后,我希望命令得到执行

这就是我所拥有的:

import sys, subprocess
command = ['sleep', '10', '&&', 'sudo', '/etc/init.d/tractor-blade', 'restart' '&']
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

# Catch stdout
sys.stdout.flush()
for line in iter(p.stdout.readline, b''):
    print(">>> " + line.rstrip())
但事实就是这样:

>>> sleep: invalid time interval `&&'
>>> sleep: invalid time interval `sudo'
>>> sleep: invalid time interval `/etc/init.d/tractor-blade'
>>> sleep: invalid time interval `restart'
>>> sleep: invalid time interval `&'
>>> Try `sleep --help' for more information.
我猜我的格式是错的


我需要在执行命令之前完成python脚本,这就是为什么我试图给命令添加延迟。我的sudoers允许使用NOPASSWD执行此“拖拉机刀片”,因此不需要密码。

API的工作方式是,
命令中的第一个元素是
子进程.Popen
将调用的程序。该列表的其余部分被解析,然后作为参数输入到该程序中。默认情况下,它们不会被解析为shell命令。

这是因为子流程可以在两种模式下工作:您可以使用
fork()
作为参数传递的元组指定的流程,或者使用shell执行字符串。区别在于
shell
参数。因此,您可能想做的是:

command = "sleep 10 && sudo /etc/init.d/tractor-blade restart"
p = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True, stderr=subprocess.STDOUT)
或:

从:

shell参数(默认为False)指定是否将shell用作要执行的程序。如果shell为True,建议将args作为字符串而不是序列传递


可能重复的我不想等待终止。我想延迟命令的执行并退出python脚本。然后我希望在python脚本退出10秒后执行该命令。是的,它仍然是相同的问题。您不需要等待
。您只需要
shell=True
time.sleep(10)
command = ['sudo', '/etc/init.d/tractor-blade', 'restart' '&']
subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)