You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中指定时间运行子进程?

解决子进程延迟执行的问题

你遇到的问题是因为传递给Popen的参数列表逻辑错误——你把|和at相关参数都当成了python3的命令行参数,而非让shell处理管道和任务调度逻辑。所以python3直接执行了helloworld.py,完全没触发at的延迟效果。下面给你几种正确的实现方式:

方法1:使用shell解析命令(简单但注意安全)

如果确定命令里没有不可信输入(避免shell注入风险),可以把整个命令作为字符串传递,并设置shell=True,让shell处理管道和at调度:

from subprocess import Popen, PIPE

# 整个命令作为字符串,shell会解析管道与at命令逻辑
process = Popen('python3 helloworld.py | at -m now +1 minute', shell=True, stdout=PIPE, stderr=PIPE)
# 可通过communicate获取输出或等待任务完成
stdout, stderr = process.communicate()

这种方式和你在终端直接敲命令的效果完全一致,shell会将python3 helloworld.py的执行指令传给at,由at将任务加入1分钟后执行的队列。

方法2:不使用shell的安全方式

如果命令涉及用户输入或需要更高安全性,推荐直接与at命令交互,通过标准输入传递要执行的命令,避免调用shell:

from subprocess import Popen, PIPE

# 以列表形式定义要延迟执行的命令(安全参数传递)
delayed_cmd = ['python3', 'helloworld.py']
# 启动at命令并指定延迟时间
at_process = Popen(['at', '-m', 'now +1 minute'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
# 将命令转为字符串,编码后传给at的标准输入(需加换行符结束输入)
cmd_str = ' '.join(delayed_cmd) + '\n'
at_process.communicate(input=cmd_str.encode('utf-8'))

这种方式的优势是不会触发shell解析,避免了潜在的注入风险,适合处理动态生成的命令参数。

方法3:Python内置延迟(仅适用于主进程保持运行的场景)

如果主进程可以持续运行,不需要系统级任务调度,也可以用Python的time.sleep先等待,再启动子进程:

import time
from subprocess import Popen, PIPE

time.sleep(60)  # 等待60秒(1分钟)
# 启动目标子进程
process = Popen(['python3', 'helloworld.py'], stdout=PIPE, stderr=PIPE)

注意:这种方法的局限性是如果主进程在等待期间退出,延迟任务就会终止;而at是系统级调度,即便主进程退出,任务依然会按时执行。

根据你的实际需求选择对应的方法即可!

内容的提问来源于stack exchange,提问作者Srujan Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:18:59