如何在屏幕会话中将 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 简化它。
我有一个简单的 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 简化它。