python 让Log既打印在屏幕上,又在文件里保存一份

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 让Log既打印在屏幕上,又在文件里保存一份相关的知识,希望对你有一定的参考价值。

一段Python脚本,
我把Log都用print打印到屏幕上了,但是我发现把这些Log保存成文件也很有价值
搜索了下,可以把标准输出重定向到文件,但是这样屏幕上就看不到实时输出了,
有什么办法能既输出到屏幕上,完后还能保存一份到文件吗?
恩.... 在保证应用逻辑仍然只用 print 语句打印Log的情况..

参考技术A 两条语句不就成了。
一条print打印到屏幕
再一条标准输出到文件追问

如果不修改逻辑中的打印相关语句,有办法吗

追答#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import sys
origin = sys.stdout
f = open('file.txt', 'w')
sys.stdout = f
# ===================================
print 'Start of program'

# 你的程序放到这里,过程中所有print到屏幕的内容都同时保存在file.txt里面了。

print 'End of program'
# ===================================
sys.stdout = origin
f.close()

追问

我这样试了,保存到文件里了,但是没有输出到屏幕上

本回答被提问者和网友采纳

使用python立即将按键打印到屏幕上

【中文标题】使用python立即将按键打印到屏幕上【英文标题】:printing key presses to the screen instantly with python 【发布时间】:2011-05-27 12:00:57 【问题描述】:

我知道这个问题很长,但我真正想知道的是粗体。

我更喜欢在 Linux 上使用 python。

我正在尝试制作一种类似于 devorak 的新键盘布局,但布局设置为 layout1 或 layout2,具体取决于您是否按住热键(热键可能应该是 ctrl?)

例如press d -> "z" 使用 key layout1 打印到屏幕

例如按 ctrl d -> "x" 使用键 layout2 打印到屏幕

我的主要问题(以及需要回答的问题)是字符需要打印到屏幕上的方式。

如果有人按下按键(按此顺序)“(a)(b)(c)(d)(ctrl+d)(shift+e=E)(f)(Enter)”

现在让我们说这些按键的输出应该是“oijzxKb” 我不希望输出以新行呈现:

o
i
j
z
x
K
b

我希望字符在按下每个字符时立即出现在屏幕上(无需等待他们按下回车键)。

e.g.
press o

Screenshot1 o

press i

Screenshot2 oi

press j

Screenshot3 oij

.. etc

我认为我将需要以下内容:

一种即时读取按键的方法 一种即时打印按键的方法(打印到终端或 GUI 或任何最简单的方式,如果它适用于任何很酷的编辑器!)

我可能可以在 PyGame 中执行此操作(但我可能无法剪切和粘贴等),我猜应​​该有更简单的方法。

我正在使用 Logitech G110 键盘,我最终可能希望在我的所有设备上的所有应用程序中使用它来替代我的 qwerty 键盘。

谢谢!

编辑:解决方案:

感谢第一时间回复, 使用来自http://code.activestate.com/recipes/134892/的Getch

getch = _Getch()
word=""
while True:
    c=getch.impl()
    if c=="a":
        word+="z"
    elif ord(c)==127: #backspace
        word=word[:-1]
    else:
        word+=c
    print word

现在就足够了,谢谢。一旦我对改进感到满意,我会考虑做一些较低级别的、不使用 python 的特定于操作系统的事情。

getch 的一个问题是 ctrl+a 无法区分 ctrl+A(例如,如果您按住 ctrl 并按键,它无法区分大小写)

【问题讨论】:

Python 可能是完成这项任务的错误工具。您使用的是哪个操作系统? 我更喜欢在 Ubuntu 上使用 python,但如果它们很简单,请随意提出替代方案。也许我可以将 python 用于更高级别的逻辑。 你应该看看 xmodmap,也许还有 xkeymaps。 【参考方案1】:

如果可以依赖X窗口系统,可以使用python-xlib模块或者xpyb模块来访问X窗口系统,使用XGrabKey调用来获取键盘相关事件。在每个KeyPress 事件中,您将能够打印按下的键。

现在,如果您真的想编写键盘映射,这完全取决于操作系统/窗口系统。如果您使用 X 窗口系统(Ubuntu 使用),您需要查看有关如何编写新键盘映射的 X 文档。在 Ubuntu 上,当前的键盘映射定义应该在 /usr/share/X11/xkb 中。看一看,并尝试复制和编辑一个。您可以使用setxkbmap 来更改当前的键盘映射。

【讨论】:

绝对的;在 python 程序中获取按键并向用户回显不同的键是完全微不足道的,但不会帮助您使用除一个 python 程序之外的任何程序。 这可能是一个有效的长期解决方案。一旦我对我的布局感到满意,我会考虑以这种方式实现它,谢谢【参考方案2】:

要修改键盘的键映射,您必须使用操作系统提供的工具。出于安全原因,大多数应用程序不接受生成的事件。

在你的情况下,那就是xmodmap。不要忘记使用 -pke 选项创建当前键盘映射的备份,因为您会犯错 - 然后,您的键盘将无法工作。

如果您还希望新的键盘映射在控制台上工作,请使用look at the kbd package,它会在内核级别更改键盘布局。

【讨论】:

谢谢,我可能想最终在我的手机上使用这个布局。唯一的问题是因为我有两个布局而不是一个,我需要一个在两者之间切换的热键。现在我正在使用 shift 键(所以每个小写都转到 layout1,每个大写都转到 layout2),但是现在我不再有大写字母,这是我最终想要解决的问题。我需要在不丢失任何原始功能的情况下将组合数量增加一倍。 Ubuntu 支持多种键盘布局。系统设置 -> 输入设备 -> 键盘 -> 布局。使用系统工具可以让您添加新布局,对其进行测试,然后切换回“正常”布局。 您也可以在那里配置快捷方式以在布局之间切换。

以上是关于python 让Log既打印在屏幕上,又在文件里保存一份的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu取消启动打印log

python 信息同时输出到控制台与文件

python logging 定向不输出到屏幕?

同时打印到屏幕和写入文件

ab工具如何打印日志

如何python在屏幕上全局性的显示一句话