当我仅使用脚本名称在 Windows 上运行 Python 脚本时无法重定向输出
Posted
技术标签:
【中文标题】当我仅使用脚本名称在 Windows 上运行 Python 脚本时无法重定向输出【英文标题】:Cannot redirect output when I run Python script on Windows using just script's name 【发布时间】:2011-03-02 10:08:53 【问题描述】:这是在 Windows 7(64 位)、Python 2.6 上运行的,带有适用于 Python 的 Win32 扩展。
我有一个简单的脚本,只打印“hello world”。我可以使用python hello.py
启动它。在这种情况下,我可以将输出重定向到文件。但是,如果我通过在命令行上键入 hello.py
并重定向输出来运行它,我会得到一个异常。
C:> python hello.py
hello world
C:> python hello.py >output
C:> type output
hello world
C:> hello.py
hello world
C:> hello.py >output
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
我想我是在升级到 Windows 7 后第一次遇到这个错误。我记得它应该在 XP 中工作。我看到人们谈论这个错误python-Bugs-1012692 | Can't pipe input to a python program。但那是很久以前的事了。它没有提到任何解决方案。
有人经历过吗?有人可以帮忙吗?
【问题讨论】:
你知道有两个输出流:stdout和stderr吗? 是的。我想重定向标准输出输出。 【参考方案1】:你是在问这个吗?
Windows:使用文件类型在命令行上执行 Python 脚本时 关联(即开始“script.py”而不是“python script.py”), 除非您设置特定的注册表项,否则重定向可能不起作用。看 知识库文章STDIN/STDOUT Redirection May Not Work If Started from a File Association。
它在 Python README 中。也许这个补丁就是你要找的。p>
【讨论】:
就是这样。只需添加 InheritConsoleHandles 注册表值即可!非常感谢!!! 文章的链接已经失效。这是该页面的存档:web.archive.org/web/20150403070207/http://support.microsoft.com/… 编辑:根据该页面的最新版本,该问题已在 Windows XP 的服务包中修复。【参考方案2】:更新答案
Microsoft KB 问题 (STDIN/STDOUT Redirection May Not Work If Started from a File Association) 可能正是这个问题。该页面有下载 Win2000 修补程序的说明,但在较新的 Windows 版本上可能不需要。在修补程序之后(或者可能没有它,取决于您的 Win 版本),需要手动编辑注册表。
您应该检查我提供的链接;无论如何,我在这里总结一下:
打开注册表编辑器并找到键HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
添加一个名为 InheritConsoleHandles
的 DWORD 值并将其设置为 1
。
大概就是这样。
【讨论】:
我在 PATHEXT 中有它。这就是我通常运行脚本的方式。不幸的是,无论是否输入 .py 扩展名,我都会遇到同样的错误。 @Wai:检查我的答案的“新的和改进的”版本,如果这对你有用,请告诉我。 糟糕。没有看到 S.Lott 已经提供了相同的链接。对不起:) 是的,这就是问题所在。谢谢。帮了大忙!【参考方案3】:如果您尝试从命令提示符重定向 stdout 和 stderr, 见http://support.microsoft.com/kb/110930
【讨论】:
【参考方案4】:我不知道这个问题,但我有一个解决它的想法。您是否考虑过添加命令行选项(如-o
)来指定将捕获输出的输出文件?
【讨论】:
感谢您的建议。这将作为最后的手段 :) 但它并不像按需键入“输出”那么轻松。另外,我有很多脚本,要全部更改是不切实际的。以上是关于当我仅使用脚本名称在 Windows 上运行 Python 脚本时无法重定向输出的主要内容,如果未能解决你的问题,请参考以下文章