【发布时间】:2020-05-12 17:01:27
【问题描述】:
根据 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”输出。
【问题讨论】:
-
你能做一个最小的可运行示例来演示这个问题吗?
-
我希望我明白你所说的“最小可运行示例”是什么意思...脚本基本上读取一系列 FLASH 输出,然后我调用 yt(一个 Python 包数据分析包)来共享工作在 Np 个进程中(使用 .piter() 方法并行化该段),输出数组被发送回根,根依次将它们收集到 2 个 np 数组(tmax 和 zmax)中,最后我发出 plot(tmax, zmax,. ..) 如上图所示。这是你要问的吗?我理解正确吗?
-
我在上面编辑了我的问题以包含完整的脚本。
-
这似乎是 matplotlib 和 mpi4py 之间的交互,但除了这些之外,您还导入了大量模块,尤其是 yt。您还使用了只有您拥有的数据。
-
一个最小的例子需要在一台不属于你的机器上运行。它还应该尽可能少做无关的工作。
标签: python matplotlib yt