python - 如何从 Python 多处理进程中捕获 stderr

标签 python multiprocessing

如何捕获从 Python 的 mulitprocessing.Process 库启动的进程的特定目标的标准输出/标准错误,最好不需要对目标函数进行特殊修改?

例如

p = Process(target=myfunc)
p.daemon=True
p.start()
p.join()
print p.exitcode, p.stderr.getvalue()

我知道如何使用自定义文件对象覆盖 sys.stdout/sys.stderr 并使用 multiprocessing.Queue 在进程之间重定向 IO,但这需要修改目标函数以将其输出写入队列。

Process 是否可以使用类似的东西?我假设它在某种程度上,因为我能够在运行时在终端中看到进程的输出,即使我无法从父进程记录它。

最佳答案

这不是答案,而是一条长评论。

我会创建一个包装函数来替换 sys.stderr 并将其写入文件/管道,然后在进程运行之后/同时将 stderr 读入父进程。原因:

如果你不改变功能,这个接缝很难

多进程不使用子进程。 您将 Process 子类化并设置 Process.Popen 以替换 multiprocessing.forking.Popen。 替换 multiprocessing.forking.Popen 必须为平台“win32”和“非 win32”实现不同的代码,从而导致两个不同的子类或使用子进程。

从我的角度来看,修改 multiprocessing.forking.Popen 以使用 subprocess 应该是你最好的尝试。

Process.start()

from .forking import Popen
self._popen = Popen(self) # also self.Popen

multiprocessing.forking

class Popen(object):
    def __init__(self, ...):
        # ...
        # for windows
        hp, ht, pid, tid = _subprocess.CreateProcess(
            _python_exe, cmd, None, None, 1, 0, None, None, None
            )

现在看看子流程:

(p2cread, p2cwrite,
     c2pread, c2pwrite,
     errread, errwrite) = self._get_handles(stdin, stdout, stderr)
self._execute_child(args, executable, preexec_fn, close_fds,
                            cwd, env, universal_newlines,
                            startupinfo, creationflags, shell,
                            p2cread, p2cwrite,
                            c2pread, c2pwrite,
                            errread, errwrite)
self.stdout = os.fdopen(c2pread, 'rU', bufsize)

关于python - 如何从 Python 多处理进程中捕获 stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21637984/

相关文章:

python - 如何使用 python 在文件中找到连续数字的路径?

python - py 调用返回的尺寸大于分辨率

python - 如何按比例将数据分为训练集和测试集?

python - 未反射(reflect)manager.dict中的值更新

python - 在 python 中使用多处理同时播放 2个声音

python - 为什么 python 正则表达式这么慢?

python - 将 pandas DataFrame 转换为 dict 并保留重复索引

python - python文档中所有这些奇怪的括号是什么

python multiprocessing - select-like 正在运行的进程以查看哪些已经完成

python - 多处理和 GUI 更新 - Qprocess 还是多处理?