首页 > 解决方案 > 如何重定向输出在python中将对象键入文本文件?

问题描述

我遇到了一个问题。我正在尝试将输出流重定向到文本文件,但即将出现的问题是我重定向的对象类型为None。重定向到文件后,我能看到的唯一输出是None

from contextlib import contextmanager


@contextmanager
def stdout_redirected(new_stdout):
   save_stdout = sys.stdout
   sys.stdout = new_stdout
   try:
       yield None
   finally:
       sys.stdout = save_stdout

    with open('output3.txt', "w") as f:
        with stdout_redirected(f):
            XYZ = hid.core.show_hids(target_vid=vendor, target_pid=product)
            print XYZ

如何重定向无类型对象的输出?

标签: pythonpython-2.7

解决方案


您不能重定向None 类型对象的输出。这样的对象没有任何输出。

您在代码中无能为力

XYZ = hid.core.show_hids(target_vid=des, target_pid=bes)

按照你想要的方式工作。那是因为您的代码将函数的返回值分配给XYZshow_hids()返回 value None。你可能认为这不是它应该如何工作的,但它实际上是这样工作的。如果一个函数没有return None,或者(在这种情况下)缺少一个return语句,那么None这就是您将要返回的内容,并且您无法在不重写该函数的情况下更改它。

您可以看到输出,因此show_hids()很明显将输出发送到控制台本身。如果你想让它去别的地方,你必须把show_hids()输出发送到你想要的地方。

评论中建议您查阅有关此主题的文档。了解仅由一两个人维护的小型第三方库的文档可能没有您想要的那么全面。这反过来意味着可能需要更多的工作来咨询。在这种情况下,您需要做的就是转到 GitHub 上的项目页面并查看示例文件夹,其中包含调用的示例代码show_hids.py和此示例 Python 2 调用:

output = codecs.getwriter('mbcs')(sys.stdout)
hid.core.show_hids(output = output)

这清楚地表明,output如果您希望输出到sys.stdout.

但这可能只会让你到目前为止。一些 USB 设备的设备名称中有 Unicode 字符,当我在 Python 2 下运行示例代码时,由于商标标志,它会在名称Natural® Ergonomic Keyboard 4000上窒息。摆弄codecs.getwriter()不会改变这一点,因为问题没有发生在输出阶段。

我已经将它作为一个问题发布在 GitHub 上,但如果由我决定,我会标记它不会修复,因为它是一个纯 Python 2 问题,并且对 Python 2 的支持将于今年结束。

所以如果你遇到这个问题,我建议你切换到 Python 3。自学 Python 2 是死路一条。

那么你需要做的就是:

with open(r"C:\Users\xxxxx\55561448.txt", "w", encoding="UTF-8") as f:
    hid.core.show_hids(output=f)

当我在评论中建议您尝试重新分配sys.stdout作为最后的手段时,这就是我的意思:

default_stdout = sys.stdout
sys.stdout = open('help.txt', 'w')
hid.core.show_hids(target_vid=des, target_pid=bes)
sys.stdout = default_stdout

这暂时是猴子补丁sys.stdout,所以它show_hids()会做你想做的事。但是在这种情况下不需要这样做,因为它show_hids()本身提供了一种将输出发送到您想要的地方的方法。


推荐阅读