我有一个简单的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
但它也没有用。
答案 0 :(得分:1)
然而我真正需要的是不工作(out.txt仍为空):
screen -Sdm tmp python test.py > out.txt
该命令的工作原理如下:
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简化它。