首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从python中的sys.stderr中读取

从python中的sys.stderr中读取
EN

Stack Overflow用户
提问于 2014-09-28 16:42:11
回答 2查看 4.8K关注 0票数 2

这里有无数关于如何从子进程的stderr和stdout中读取的问题。是否可以使用当前流程的stderr来完成此操作?我检查了它,它引发了一个IO错误:文件未打开以供读取。

我需要读取stderr并获取数据以供进一步处理。有什么方法可以在“r+”模式下打开文件吗?

我想到的一种方法是使用类似于以下类的类覆盖默认的sys.stderr:

代码语言:javascript
复制
class CustomStdErr(object):
    def write(self, data):
        with open(fakestderr, 'r+') as f:
            f.write(data)

sys.stderr = CustomStdErr()

还有其他更直接的方法吗?

编辑:为什么需要stderr:

代码中有一个线程(称为X),它与主线程(称为M)交互。主线程已启用日志记录。这将被重定向到stderr。现在,线程X的职责是监视stderr并从中读取,并对主线程进行处理。总之,这就是正在发生的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-28 17:42:54

你不能直接做你想做的事。如果一个线程写入默认的sys.stderr,默认情况下它将被发送到终端,而另一个线程将不可能读取该线程。

但是..。您可以始终将sys.stderr更改为具有接受字符串参数的write方法的任何对象(从标准Python sys模块的文档中提取:stderr不必内置文件对象:任何对象只要有接受字符串参数的write()方法即可接受。(更改这些对象不影响os.popen()__、os.system()或os模块中的exec*()系列函数执行的标准I/O流)。

简而言之:如果您的线程直接写入sys.stderr,则可以创建一对具有os.pipe()的管道,从而影响到sys.stderr的写入端,从监视线程中读取读取端,而不是仍然可以将其写入sys.__sterr__或保存的sys.stderr值。

如果线程启动子进程,请使用subprocess.Popen对象将子命令的stderr流重定向到管道,并从监视线程中读取它。

票数 2
EN

Stack Overflow用户

发布于 2014-09-28 18:17:09

如果您在*ix上,并且您有一个交互过程,您可以打开(‘/dev/tty’,'r')。这类似于从stderr中读取。注意,open('/dev/tty",'r+')只在2.x中工作;在3.x中,您需要打开(‘/dev/tty’,'r')。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26087175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档