我有一个Python脚本正在使用我的雇主提供的某些封闭式Python函数(即我无法编辑这些函数)。当我调用这些函数时,它们会将输出打印到我想抑制的Linux终端上。我试过通过重定向标准输出/标准错误;
orig_out = sys.stdout
sys.stdout = StringIO()
rogue_function()
sys.stdout = orig_out
但这无法捕获输出。我认为我通过Python调用的函数(上面的rogue_function())实际上是经过编译的C代码的包装程序,它们实际上是在进行打印。
有谁知道一种方法可以对某个函数(以及该函数调用的任何子函数)传递给stdout / stderr的任何打印内容进行“深度捕获”?
更新 :
我最终采用了下面所选答案中概述的方法,并编写了一个上下文管理器来禁止stdout和stderr:
# Define a context manager to suppress stdout and stderr.
class suppress_stdout_stderr(object):
'''
A context manager for doing a "deep suppression" of stdout and stderr in
Python, i.e. will suppress all print, even if the print originates in a
compiled C/Fortran sub-function.
This will not suppress raised exceptions, since exceptions are printed
to stderr just before a script exits, and after the context manager has
exited (at least, I think that is why it lets exceptions through).
'''
def __init__(self):
# Open a pair of null files
self.null_fds = [os.open(os.devnull,os.O_RDWR) for x in range(2)]
# Save the actual stdout (1) and stderr (2) file descriptors.
self.save_fds = [os.dup(1), os.dup(2)]
def __enter__(self):
# Assign the null pointers to stdout and stderr.
os.dup2(self.null_fds[0],1)
os.dup2(self.null_fds[1],2)
def __exit__(self, *_):
# Re-assign the real stdout/stderr back to (1) and (2)
os.dup2(self.save_fds[0],1)
os.dup2(self.save_fds[1],2)
# Close all file descriptors
for fd in self.null_fds + self.save_fds:
os.close(fd)
要使用此功能,您只需:
with suppress_stdout_stderr():
rogue_function()
这工作“相当好”。它确实抑制了使脚本混乱的流氓功能的打印输出。我在测试中注意到,它可以通过引发的异常以及某些记录程序打印,但我还不完全清楚为什么。我认为这与
将 这些消息发送到stdout / stderr有关(我认为这是在上下文管理器退出之后发生的)。如果有人可以确认这一点,我将有兴趣听详细信息…
这种方法(通过相关的侧边栏找到)可能有效。它在sys.stdout等中重新分配文件描述符,而不仅仅是包装。
问题内容: 我想通过python从目录中调用脚本(它们是可执行的shell脚本)。 到现在为止还挺好: 现在我想要的是:假设我有一个具有启动功能的bash脚本。我从那里打电话 回声“某事” 现在,我想看看sys.stdout和退出代码上的回显。我相信您可以使用.communicate()执行此操作,但是我的操作不符合我的预期。 我究竟做错了什么? 任何帮助深表感谢 问题答案: 授予http://d
我有一个Python脚本,打开火狐。有没有办法让我在后台运行它,并抑制窗口弹出?类似于
我是一个Linux新手,我正在运行以下Linux命令: 一切都如预期的那样运作;python(2.7)print语句的所有输出都记录在名为my.out的文件中。 唯一的问题是,在运行了几天之后,My.out文件变得非常大。有没有一种方法(在Linux shell级别)可以创建一个新的“my.out”,比方说每天一次,在文件名中带有时间戳?
问题内容: 我想捕获并显示通过Python的子流程调用的流程的输出。 我以为我可以将文件状对象作为参数stdout和stderr传递 我可以看到它访问了属性-因此它正在处理对象。但是,永远不会调用该方法。我的方法是否完全无效或我只是缺少什么? 更新: 我还想工作的是ANSI控制字符,用于移动光标并覆盖以前的输出内容。我不知道这是否是正确的术语,但这是我的意思的一个示例:我正在尝试使一些GIT自动化
我正在尝试编写一个在后台执行控制台命令并侦听StdOut和StdErr的函数。如果出现错误,它会抛出StdErr和StdOut。我正在尝试使用Autohotkey。首先,我尝试使用WScript。Shell COM Object,但StdErr和StdOut始终为空,尽管StdOut绝对应该为非空。关于WScript的信息不多。Shell COM Object和所有Microsoft文档都在技术档
问题内容: 我已经搜索过,但我只能找到有关另一种方式的问题:将stdin写入文件:) 有没有一种快速简便的方法将文件内容转储到stdout? 问题答案: 当然。假设您有一个字符串,文件名为,下面的技巧就可以了。