如何在屏幕会话中将 python 打印重定向到文件,同时 运行 它

How to redirect python print to a file while running it inside a screen session

我有一个简单的 python 脚本 test.py:

from __future__ import print_function
print("Hello")

我尝试在屏幕会话中将打印重定向到一个文件。以下内容有效:

无屏幕:

python test.py > out.txt

有屏幕,一步一步:

screen -S tmp
python test.py > out.txt
exit

但是我真正需要的东西不起作用(out.txt 仍然是空的):

screen -Sdm tmp python test.py > out.txt

看了一个貌似相关的question我也试了:

screen -Sdm tmp stdbuf -i0 -o0 -e0 python test.py > out.txt

但是也没用。

您考虑过使用文件 read/write 吗? 示例:

file = open("path/to/file", "w")
file.write("Hello")
file.close

However what I really need is not working (out.txt remains empty):

screen -Sdm tmp python test.py > out.txt

该命令的工作原理如下:

  • shell 启动 screen 程序,标准输出重定向到 out.txt
  • screen 会话中 python 是 运行,没有任何输出重定向。人们可能期望 python 的输出最终应该发送到 out.txt,因为输出重定向应用于其父进程。但是,这不会发生,因为 screen 自己管理输出流。

您可以通过在 screen 会话中进行输出重定向来解决问题,如下所示:

screen -Sdm tmp bash -c "python test.py > out.txt"

这 运行s 在 screen 以下命令下:

bash -c "python test.py > out.txt"

代表启动bash并在其中执行命令 "python test.py > out.txt".

我不确定您如何在外部重定向输出或该屏幕命令如何工作,但如果修改 Python 程序在您的控制之下,那么 this solution 呢?你可以在程序的最开始写这样的东西:

import sys

class Logger(object):
    def __init__(self, logfile):
        self.terminal = sys.stdout
        self.log = open(logfile, "a")

    def write(self, message):
        self.terminal.write(message)  # This might be optional for you
        self.log.write(message)  

    def flush(self):
        #this flush method is needed for python 3 compatibility.
        #this handles the flush command by doing nothing.
        #you might want to specify some extra behavior here.
        pass    

if len(sys.argv) > 1:  # Just in case no argument was passed to the program
    sys.stdout = Logger(sys.argv[1])

这样做,您就不需要重写每个打印语句。然后,您将在没有 > 重定向的情况下使用 screen 命令,将文件作为普通参数传递:

screen -Sdm tmp python test.py out.txt

或者您可能需要引号才能使其工作:

screen -Sdm tmp python "test.py out.txt"

只实现一些日志记录怎么样?使用 daiquiri 简化它。