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

时间:2014-05-05 15:58:19

标签: python

我正在尝试使用子进程:sleep 10 && sudo /etc/init.d/tractor-blade restart &

从python脚本执行此命令

我希望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执行,因此不需要密码。

2 个答案:

答案 0 :(得分:5)

这是因为子进程可以在两种模式下工作:要么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)

或:

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

来自documentation

  

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

答案 1 :(得分:0)

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