python - 如何重定向输出在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
如何重定向无类型对象的输出?
解决方案
您不能重定向None 类型对象的输出。这样的对象没有任何输出。
您在代码中无能为力
XYZ = hid.core.show_hids(target_vid=des, target_pid=bes)
按照你想要的方式工作。那是因为您的代码将函数的返回值分配给XYZ
并show_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()
本身提供了一种将输出发送到您想要的地方的方法。
推荐阅读
- javascript - 访问这个。
来自 Nuxt 插件 - mysql - SQl 查询以显示 XXXX 年每个国家和每个性别的销售量最受欢迎的类别
- javascript - VS 代码中更漂亮的扩展不起作用,我尝试了包括 yt 教程在内的所有内容,但我所做的一切都没有帮助
- python - 生成 M 乘 N 矩阵
- python - 数据库错误:NameError:未定义名称“db”。我究竟做错了什么?
- django - 如何在 Django 的 SignUp 表单中实现扩展的 auth-User 模型?
- powershell - 如何使用 powershell 脚本在资源监视器中搜索文件
- java - 如何用线条打印孔二叉搜索树
- swift - Swift - 如何在不取消选择注释的情况下更新(自定义或非自定义)MKAnnotation 标注中的观察数据
- reactjs - TypeError:无法分配给只读属性 - 在 React 子组件中