如何捕获从 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/