使用subprocess延迟执行命令

5 投票
2 回答
9963 浏览
提问于 2025-04-18 05:26

我想在一个Python脚本里用subprocess来执行这个命令: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设置允许这个`tractor-blade`命令在不需要密码的情况下执行。

2 个回答

0

这个API的工作方式是,command列表中的第一个元素是要被subprocess.Popen调用的程序。后面的元素会被解析,然后作为参数传递给这个程序。默认情况下,这些参数不会被当作一个shell命令来解析。

7

这是因为子进程可以有两种工作模式:一种是你通过传入的元组来fork()指定的进程,另一种是通过一个字符串来执行命令。它们的区别在于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)

来自文档的说明:

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

撰写回答