【问题标题】:Why can't I redirect stdout of a python script to a file为什么我不能将 python 脚本的标准输出重定向到文件
【发布时间】:2016-06-20 00:20:06
【问题描述】:

我正在使用rc.local 中的命令启动在 Raspberry Pi 2 (Raspbian) 上运行的服务,如下所示:

python3.4 /home/pi/SwitchService/ServiceStart.py >/home/pi/SwitchService/log &
python3.4 /home/pi/test.py >/home/pi/log2 &

由于某种原因,尽管脚本打印到标准输出,但我在服务的日志文件中看不到任何文本。

这两个脚本如下所示:

test.py

print("Test")

ServiceStart.py

from Server import Server
print("Test")
if __name__ == "__main__":
    server = Server()

因为我无法让 bash 解决方案正常工作,所以我尝试了 this other solution 是否适合我。它的行为与基于 bash 的方法完全相同。因此,尽管创建了空文件,但我的服务不会向日志文件写入任何内容。

【问题讨论】:

  • 你确定脚本真的在运行吗?启动例程通常不会设置PATH,因此如果没有完整路径,它可能不知道python3.4 的位置。
  • 您确定 ServiceStart 正在写入标准输出吗?还是写到stderr?当你不守护它时会发生什么?它打印任何东西吗?到哪个标准文件?标准输出还是标准错误?
  • @Mr.Llama 我可以确认脚本正在运行,因为我可以使用该服务。
  • @threadp 当我从终端调用它时,它工作得很好。当我调用 print() 时,我认为它使用标准输出,不是吗?
  • @ThunderStorm 您是否还可以重定向 stderr 以进行调试? python3.4 /home/pi/SwitchService/ServiceStart.py >& /home/pi/SwitchService/log &(注意 >& 而不是 >

标签: bash python-3.x stdout


【解决方案1】:

首先,确保您的脚本确实在运行。许多调度程序和启动例程没有设置PATH,因此它可能找不到python3.4。尝试修改命令以包含完整路径(例如/full/path/python3.4)。

其次,不建议在rc.local 中包含长时间运行的脚本而不在后台运行它们(the documentation 甚至声明了这一点)。 Raspberry Pi 在继续启动之前会等待命令完成,因此如果它永远运行,您的 Raspberry Pi 可能永远无法完成启动。

最后,假设前面两个问题已经解决,请确保您的程序不会过于激进地缓冲输出。您可以尝试flushing stdout 看看是否有帮助。

【讨论】:

  • 感谢您的回答。我处理了前两个问题。解决方案是刷新标准输出(尽管每次都这样做似乎很奇怪)。就我而言,我在 python 脚本调用中添加了-u
  • -u 正是我在这里所需要的。关于为什么文件是空的,直到过程结束,我一直摸不着头脑 - 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多