自修改的Python? 我怎样才能重定向功能中的所有打印语句不碰sys.stdout的?(Sel

2019-11-04 10:03发布

我在那里,我试图港口一些大的,复杂的Python程序的线程环境中的情况。

我希望能够到,在每个呼叫的基础上,从重定向功能的输出print别处声明(一logging.Logger是具体的)。

我真的不想修改我编译代码的源代码,因为我需要保持与调用这些模块等软件向后兼容(这是单线程的,并通过书面简单地抓住一切捕获输出sys.stdout ) 。

我知道最好的选择是做一些改写,但我真的没有选择在这里。

编辑 -

另外,有什么办法可以覆盖打印的本地定义指向不同的功能?

然后,我可以定义本地打印=系统打印,除非由kwarg覆盖,将只涉及在每个程序的开始修改几行。

Answer 1:

在python2.6的(2.7),你可以使用

from __future__ import print_function

然后,您可以更改代码以使用print()函数,你会为Python3

这使您可以创建一个模块全局或局部函数调用打印,将优先使用的内置函数

例如。

from __future__ import print_function

def f(x, print=print):
    print(x*x)

f(5)
L=[]
f(6, print=L.append)
print(L)


Answer 2:

修改源代码不需要暗示打破向后兼容性。

你需要做的就是先用该做同样的事情的函数调用替换每个print语句什么:

import sys
def _print(*args, **kw):
    sep = kw.get('sep', ' ')
    end = kw.get('end', '\n')
    file = kw.get('file', sys.stdout)
    file.write(sep.join(args))
    file.write(end)

def foo():
   # print "whatever","you","want"
   _print("whatever","you","want")

然后,第二步骤是停止直接使用_print功能并使其关键字参数:

def foo(_print=_print):
    ...

并确保更改所有的内部函数调用是传递的_print功能。

现在,所有现有的代码会继续工作,将利用打印,但你可以在任何你想要的_print功能通过。

需要注意的是_print的签名正是在最近版本的Python的打印功能的,所以只要你升级你可以改变它使用print() 你还可以逃脱使用2to3的迁移现有的代码应该减少所需的编辑打印报表。



Answer 3:

有人在六十年代对于如何解决这个想法,但它需要一个有点外星科技。 不幸的是Python有没有“当前环境”的概念,这意味着你不能提供上下文,除非在调用的参数,指定要。

对于只处理这一特定问题有关与依赖于特定线程上下文中的行为方式类似文件的对象替换标准输出什么? 这样的源代码保持不变,但例如,你可以得到一个单独的日志为每个线程。 它甚至很容易做到这一点对一个特定的每次呼叫的方式...例如:

class MyFakeStdout:
    def write(self, s):
        try:
            separate_logs[current_thread()].write(s)
        except KeyError:
            old_stdout.write(s)

然后将具有一个功能在本地设置记录器到呼叫( with

PS:我看到了“不接触标准输出”的称号,但我想这是因为你想只有一些线程受到影响。 触摸它同时还允许其他线程的工作不受影响,似乎我的问题兼容。



文章来源: Self Modifying Python? How can I redirect all print statements within a function without touching sys.stdout?