【问题标题】:Get Python command line output when called from a bash script从 bash 脚本调用时获取 Python 命令行输出
【发布时间】:2014-08-31 14:59:57
【问题描述】:

这可能是一个超级简单的问题。我通过 shell 脚本在 Lubuntu OS (Cubietruck) 上调用 Python 脚本。这是为了在启动时自动化这个过程(我想维护这个过程)。有没有一种简单的方法来查看 Python 的输出?目前 Python 脚本在后台运行,没有终端。我有一些需要检查的错误。脚本是:

#!/bin/sh
python recordSound.py

提前致谢。

【问题讨论】:

  • 当你直接在命令行上运行python recordSound.py 时会产生任何输出吗?
  • 将logging 添加到您的脚本中,然后阅读日志。
  • 嗨,Miquel,是的。我有许多打印语句/异常来捕获进度和错误。
  • 嗨,Burhan,我想记录输出,但如果可能的话想实时检查,因为这是一个在启动时运行并触发其他应用程序和硬件的脚本。它也将是一个无头单元,我将在开始时进行 VNC,因此我希望尽早看到进展。 (还是)感谢你的建议。这可能是前进的方向。

标签: python bash shell ubuntu


【解决方案1】:

正确的解决方案可能会使用评论中建议的logging。

与此同时,您必须重定向 both 标准 输出 和标准 error 流,以便将正常输出捕获为墙正如您的脚本报告的任何错误:

#!/bin/sh
python recordSound.py >> logfile.log 2&>1

请参阅one of the many web pages on that topic 以探索可从 shell 脚本获得的各种重定向。


另外,如果你需要在控制台登录和实时查看,使用tee标准命令:

#!/bin/sh
python recordSound.py 2&>1 | tee logfile.log

【讨论】:

【解决方案2】:

直接调用您的脚本。就像您使用 shebang (#!) 调用 bash 脚本一样,您可以使用 #!/bin/env python 调用您的 python 脚本。然后您需要做的就是通过chmod +x yourscript.py 授予可执行权限,并像应用程序一样直接调用您的脚本。这样,您可以看到错误代码。另一种方法是使用 logger 模块,它非常适合查看回溯和调试信息。

【讨论】:

  • 我试过这个,但没有任何乐趣。这可能是我的 PATH。普遍的共识是采用记录器方法。
【解决方案3】:

将输出从脚本重定向到文件的一种非常简单的方法

#!/bin/sh
python recordSound.py >> logfile.log

请参阅IO redirection 上的文档

【讨论】:

    【解决方案4】:

    我不是 bash 专家,但我认为这应该可行,因为除非另有说明,否则 python 会在标准输出上打印:

    #!/bin/sh
    python recordSound.py >> /tmp/my_python_log.txt
    

    每次 python 输出内容时都会添加行。转到指定的路径以读取结果。如果您想要实时取景,请使用管道“|”重定向输出。

    编辑:对于实时视图,您还可以在另一个解决方案正在运行时在另一个终端上使用“tail -f /tmp/my_python_log.txt”命令,该命令将首先打印文件中的最后 10 行左右,然后自动添加新添加的行。我喜欢这个命令,非常方便查看小型 Apache 服务器上的活动。您甚至可以一次观看多个日志!

    【讨论】:

    • 在阅读了 Burhan 的评论后,我想说他的解决方案更加健壮和高效/正确的做事方式,但是对于一个小脚本,手动重定向,懒惰的方式,甚至使用 bash 来简化一切如果通过 python 打印看起来毫无意义,那么当您可以直接从 python 登录时重定向会更好,因为您可以通过删除“|”轻松地从“日志记录”转到“实时输出”或“>>”。
    • 但是不要忘记,如果这样配置,日志记录可以产生标准输出或错误输出...
    • 是的,但它需要阅读其手册,我经常选择简单的通用非高效解决方案,因为我确定它们在每种情况下的表现。我可能会稍微重新发明轮子,但至少我的轮子不会在第 500 次执行时随机抛出我不知道的异常。
    • 公平 - 我也尝试遵循 KISS 原则
    【解决方案5】:

    在您的 python 代码中,您可能需要添加 flush=True 以在通过 .sh 运行时立即显示打印消息

    print('你的消息', flush=True)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-19
      • 2021-07-13
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      相关资源
      最近更新 更多