如何使用os.execl重启Python脚本并保留-u参数与日志重定向配置?
如何使用os.execl重启Python脚本并保留-u参数与日志重定向配置?
嘿,我懂你碰到的麻烦了!你之前用shell命令/usr/bin/python3 -u /home/pi/MyScript.py >> /home/pi/myScript.log运行脚本时,>>是shell负责处理的输出重定向操作,并不是传给Python的命令行参数。但你直接把>>和日志文件名加到os.execv的参数列表里时,Python会把这些当成脚本的普通参数,根本不会处理重定向,所以输出还是会跑到终端里,这就是问题的核心所在。
下面给你两种可行的解决办法,你可以根据需求选择:
方法一:通过shell执行完整命令
既然原来的命令是靠shell处理重定向的,那我们可以直接调用shell来执行整个重启命令,这样shell会帮我们解析-u参数和>>重定向逻辑,完美还原原来的运行环境:
import os # 用sh -c来执行完整的shell命令 os.execl('/bin/sh', 'sh', '-c', '/usr/bin/python3 -u /home/pi/MyScript.py >> /home/pi/myScript.log')
这里的sh -c后面跟着的就是你原来的完整运行命令,shell会像你手动输入时一样处理它,完全匹配你之前的运行方式。
方法二:在Python代码中手动处理输出重定向
如果你不想依赖shell,也可以在重启前自己把标准输出、标准错误重定向到日志文件,新启动的Python进程会继承这个文件描述符,输出自然就写到日志里了:
import os import sys # 以追加模式打开日志文件,和>>的行为一致 log_path = '/home/pi/myScript.log' log_file = open(log_path, 'a') # 把标准输出和标准错误都重定向到日志文件 sys.stdout = log_file sys.stderr = log_file # 执行重启,带上-u参数 os.execl('/usr/bin/python3', '/usr/bin/python3', '-u', '/home/pi/MyScript.py')
这种方式更“原生”,不需要经过shell中转,而且-u参数依然生效,保证输出无缓冲,日志能实时更新。
两种方法都能解决你的问题,要是你需要和原来的shell命令完全一致,选第一种就行;要是想更可控、不依赖shell,第二种更合适。
备注:内容来源于stack exchange,提问作者Giammaria
相关产品推荐
相关产品推荐

