Spyder环境下Python多进程无打印输出问题求助
解决Spyder中多进程子进程print内容不显示的问题
嗨,我刚好了解这个问题!你遇到的情况是旧版本Spyder(比如你用的3.2.4)的一个常见bug——它的IPython控制台对多进程的标准输出(stdout)捕获支持不完善,导致子进程里的print内容无法传递到主控制台显示,哪怕子进程本身在正常运行。
下面给你几个可行的解决方法:
方法1:使用日志模块替代直接print
Python的logging模块能更好地处理多进程的输出转发,你可以修改代码用日志输出代替print:
__spec__ = None # Spyder所需的临时设置 from multiprocessing import Process import os import logging # 配置日志,确保输出格式简洁 logging.basicConfig(level=logging.INFO, format='%(message)s') logger = logging.getLogger() def info(title): logger.info(title) logger.info(f'module name: {__name__}') logger.info(f'parent process: {os.getppid()}') logger.info(f'process id: {os.getpid()}') def f(name): info('function f') logger.info(f'hello {name}') if __name__ == '__main__': info('main line') p = Process(target=f, args=('bob',)) p.start() p.join()
方法2:用队列(Queue)手动传递输出
通过multiprocessing.Queue让子进程把输出内容传给主进程,再由主进程统一打印:
__spec__ = None # Spyder所需的临时设置 from multiprocessing import Process, Queue import os def info(title, q): q.put(title) q.put(f'module name: {__name__}') q.put(f'parent process: {os.getppid()}') q.put(f'process id: {os.getpid()}') def f(name, q): info('function f', q) q.put(f'hello {name}') def print_queue(q): while not q.empty(): print(q.get()) if __name__ == '__main__': q = Queue() info('main line', q) print_queue(q) p = Process(target=f, args=('bob', q)) p.start() p.join() print_queue(q)
方法3:更新Spyder到新版本
你用的3.2.4是比较老的版本了,Spyder 4.x及以后的版本已经修复了多进程输出捕获的问题。更新后直接运行你的原有代码,子进程的print内容应该就能正常显示了。
方法4:在系统终端运行脚本
如果暂时不想更新Spyder,你可以把代码保存为.py文件,然后打开系统终端(Windows的cmd/PowerShell,或者Linux/macOS的终端),用python 你的文件名.py命令运行,子进程的print内容会正常输出到终端里——因为终端的标准输出没有Spyder控制台的捕获限制。
内容的提问来源于stack exchange,提问作者J.Galt
相关产品推荐
相关产品推荐

