根据 ngoldbaum 的建议,我在这里发布了一个以前的 Python 脚本的可运行示例。最后,我想让 root 执行一个绘图(来自调用 matplotlib 的包 scitools),但它遇到错误并且不产生任何输出。
import matplotlib
matplotlib.use('Agg')
import sys
import numpy as np
import yt
from scitools.all import *
from scitools.std import *
from matplotlib import rc
from mpi4py import MPI
yt.enable_parallelism()
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
nprocs = comm.Get_size()
print "rank, nprocs", rank, nprocs
#
out_tmax = []
out_zmax = []
n_el = np.zeros(nprocs, dtype=int)
xmin = 0.
xmax = 2.2
deltax = (xmax - xmin)/nprocs
xmin_loc = xmin + rank*deltax
xmax_loc = xmin_loc + deltax
n_el[rank] = 10*(1 + rank)
if rank == 0:
out_tmax = np.linspace(xmin_loc,xmax_loc,n_el[rank])
out_zmax = sin(out_tmax)
print "ok", out_tmax, out_zmax
# Plot
if yt.is_root():
#if rank == 0:
rc('font',**{'family':'serif','serif':['Times']})
## for Palatino and other serif fonts use:
# rc('font',**{'family':'serif','serif':['Palatino']})
rc('text', usetex=True)
rc('legend',fontsize=12)
rc('axes',labelsize=14, titlesize=18)
rc('xtick', labelsize=14)
rc('ytick', labelsize=14)
plot(out_tmax, out_zmax, 'b', fontname='Times new Roman', xlabel=(r'Time (Myr)'), ylabel=(r'\mathrm{z_{HS}}'), hardcopy='fig1.png')
看起来根进程没有继承开始时做出的“use: Agg”选择(我没有得到 plot() 中指定的任何 *png 输出。我使用 s 脚本将它提交到 PBS 批处理系统:
#!/bin/bash
## Name of the job
#PBS -N test_mpi4py_matlib
#PBS -l select=1:ncpus=4:mpiprocs=4:mem=24gb
#PBS -l place=scatter
#PBS -e test_gatherv_print.err
#PBS -o test_gatherv_print.out
#PBS -l walltime=00:20:00
....
mpirun python2.7 test_gatherv_print.py
此脚本的前两行应防止 plot(基于 matplotlib)查找 DISPLAY 环境变量。
此脚本失败并出现以下错误:
File "test_gatherv_print.py", line 49, in <module>
plot(out_tmax, out_zmax, 'b', fontname='Times new Roman', xlabel=(r'Time (Myr)'), ylabel=(r'\mathrm{z_{H
S}}'), hardcopy='fig1.png')
File "/home/van/software/python/scitools/lib/python2.7/site-packages/scitools/easyviz/common.py", line 313
9, in plot
self.setp(**kwargs)
File "/home/van/software/python/scitools/lib/python2.7/site-packages/scitools/easyviz/common.py", line 194
1, in setp
self.hardcopy(kwargs['hardcopy'])
File "/home/van/software/python/scitools/lib/python2.7/site-packages/scitools/easyviz/matplotlib_.py", lin
e 1065, in hardcopy
self._replot()
File "/home/van/software/python/scitools/lib/python2.7/site-packages/scitools/easyviz/matplotlib_.py", lin
e 944, in _replot
self._g.figure(self.getp('curfig'))
File "/opt/Python-2.7.9/lib/python2.7/site-packages/matplotlib/pyplot.py", line 533, in figure
**kwargs)
File "/opt/Python-2.7.9/lib/python2.7/site-packages/matplotlib/backend_bases.py", line 161, in new_figure_
manager
return cls.new_figure_manager_given_figure(num, fig)
File "/opt/Python-2.7.9/lib/python2.7/site-packages/matplotlib/backends/_backend_tk.py", line 1046, in new
_figure_manager_given_figure
window = Tk.Tk(className="matplotlib")
File "/opt/Python-2.7.9/lib/python2.7/lib-tk/Tkinter.py", line 1810, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
P000 yt : [ERROR ] 2020-05-13 16:28:32,964 TclError: no display name and no $DISPLAY environment variable
P000 yt : [ERROR ] 2020-05-13 16:28:32,965 Error occured on rank 0.
尽管我在上面的 matplotlib.use() 中指定了“Agg”输出。