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

时间:2017-08-03 13:40:52

标签: python gnu-screen

我有一个简单的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

但它也没有用。

4 个答案:

答案 0 :(得分:1)

  

然而我真正需要的是不工作(out.txt仍为空):

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"

screen下运行以下命令:

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

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

答案 1 :(得分:1)

我不确定如何在外部重定向输出或该屏幕命令如何工作,但如果修改该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])

通过这样做,您不需要重写每个print语句。然后,您将使用screen命令而不使用>重定向,将文件作为正常参数传递:

screen -Sdm tmp python test.py out.txt

或许您可能需要引号才能使用:

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

答案 2 :(得分:0)

你考虑过使用文件读/写吗? 例如:

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

答案 3 :(得分:-1)

如何实施一些日志记录?使用daiquiri简化它。