将四个并行运行的Python程序的输出保存到不同的日志文件中

3

我有四个不同的程序正在运行,它们是使用单个Python程序启动的。

import os                                                                       
from multiprocessing import Pool 
import sys   
processes = ('p1.py', 'p2.py', 'p3.py','p4.py')
def run_process(process):                                                             
    os.system('python3 {}'.format(process)) 
pool = Pool(processes=4)                                                        
pool.map(run_process, processes)

目前我正在使用nohup将所有程序的日志记录到一个文件中,使用命令如下:pmain.py>test.log 但是我该如何将p1、p2、p3和p4的日志分别记录在不同的日志文件中呢?


一个简单的解决方法是 processes = ('p1.py > p1.log', 'p2.py > p2.log', 'p3.py > p3.log', 'p4.py > p4.log')。但不要这样做。也不要使用 os.system - han solo
这个回答解决了你的问题吗?记录multiprocessing.Process的日志输出 - abhilb
https://docs.python.org/3/howto/logging-cookbook.html#using-a-rotator-and-namer-to-customize-log-rotation-processing ,,, https://docs.python.org/3/library/logging.handlers.html#logging.handlers.QueueHandler - wwii
1个回答

4
一个简单的修复方法是执行:
import os                                                                       
from multiprocessing import Pool 
import sys   
processes = ('p1.py > p1.log', 'p2.py > p2.log', 'p3.py > p3.log','p4.py > p4.log')
def run_process(process):                                                             
    os.system('python3 {}'.format(process)) 
pool = Pool(processes=4)                                                        
pool.map(run_process, processes)

但是不要做上面的事情。

正确的做法是使用 subprocess,像这样:

import subprocess
processes = ('p1.py', 'p2.py', 'p3.py','p4.py')
procs = []
for pname in processes:
  logfile = os.path.splitext(pname)[0] + '.log'
  with open(logfile, 'w') as f:
    proc = subprocess.Popen(['python3', pname], stdout=f)
    procs.append(proc)

for proc in procs:
  proc.wait()

你为什么更喜欢第二种方式而不是第一种方法? - sharath
因为直接使用 os.system 是不被看好的,而第二种方法可读性更强,并且完成相同的事情。 - han solo
subprocess.Popen 是一个非阻塞调用。我们需要等待所有进程退出吗? - han solo
没问题。我很高兴能够帮助。 - han solo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接