小编Eci*_*irH的帖子

如何在Python中重定向stderr?

我想记录Python脚本的所有输出.我试过了:

import sys

log = []

class writer(object):
    def write(self, data):
        log.append(data)

sys.stdout = writer()
sys.stderr = writer()
Run Code Online (Sandbox Code Playgroud)

现在,如果我"打印'某些东西'"它就会被记录下来.但是,如果我做了一些语法错误,比如说"打印'某些东西#",它就不会被记录 - 它将进入控制台.

我如何捕获Python解释器中的错误?

我看到了一个可能的解决方案:

http://www.velocityreviews.com/forums/showpost.php?p=1868822&postcount=3

但第二个例子登录到/ dev/null - 这不是我想要的.我想将它记录到像我上面的例子或StringIO这样的列表中......

另外,我最好不要创建子进程(并在单独的线程中读取它的stdout和stderr).

python redirect stderr

19
推荐指数
6
解决办法
5万
查看次数

如何在Python中重定向stderr?通过Python C API?

这是我最近两个问题的组合:
[1] C中的Python实例方法
[2] 如何在Python中重定向stderr?

我想从python脚本中记录stdout和stderr的输出.

我想问的是,根据[1]创建一个新类型似乎相当复杂.如果不需要将新类型公开给Python,它是否简化了事情,即它只存在于C中?

我的意思是,当Python打印出来时会转到"Objects/fileobject.c",而在"PyFile_WriteObject"中它会检查是否可以写入其参数:

writer = PyObject_GetAttrString(f, "write");
if (writer == NULL)
...
Run Code Online (Sandbox Code Playgroud)

此外,有可能像这样得到stdout和stderr:

PyObject* out = PySys_GetObject("stdout");
PyObject* err = PySys_GetObject("stderr");
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有可能构造必要的PyObject,它满足上面的'PyObject_GetAttrString(f,"write")'并且可以调用,所以我可以写:

PySys_SetObject("stdout", <my writer object / class / type / ?>);
Run Code Online (Sandbox Code Playgroud)

http://docs.python.org/c-api/sys.html?highlight=pysys_setobject#PySys_SetObject

这样,就没有必要将新的"writer类型"暴露给Python脚本的其余部分,所以我认为编写代码可能有点简单......?

c python stdout python-c-api io-redirection

2
推荐指数
2
解决办法
3080
查看次数

标签 统计

python ×2

c ×1

io-redirection ×1

python-c-api ×1

redirect ×1

stderr ×1

stdout ×1