Troubleshooting PyGMT install on MacOS

Hi,

my PyGMT install somehow copes with ghostrcript… at least I guess. Maps which utilize fonts are not generated. Here is example script:

import pygmt
fig = pygmt.Figure()
fig.basemap(region=[0, 1, 0, 1], projection="X5c", frame="af")
fig.show()

and errors it spits out:

psconvert [ERROR]: System call [gs -q -dNOSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox -DPSL_no_pagefill -dMaxBitmap=2147483647 -dUseFastColor=true '/Users/pawleeq/.gmt/sessions/gmt_session.51122/gmt_1.ps-' 2> '/Users/pawleeq/.gmt/sessions/gmt_session.51122/psconvert_51122c.bb'] returned error 256.
 
*** Warning: GenericResourceDir doesn't point to a valid resource directory.
               the -sGenericResourceDir=... option can be used to set this.
 
Error: /invalidfont in findfont
Operand stack:   PSL_AH0   0   --nostringval--   Helvetica   Helvetica
Execution stack:   %interp_exit   .runexec2   --nostringval--   .findfontop   --nostringval--   2   %stopped_push   --nostringval--   .findfontop   .findfontop   false   1   %stopped_push   1933   1   3   %oparray_pop   1932   1   3   %oparray_pop   1917   1   3   %oparray_pop   1787   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   .findfontop   --nostringval--   2   %stopped_push   --nostringval--   .findfontop   .findfontop   1883   5   4   %oparray_pop
Dictionary stack:   --dict:752/1123(ro)(G)--   --dict:0/20(G)--   --dict:85/200(L)--   --dict:162/250(L)--
Current allocation mode is local
Last OS error: No such file or directoryCurrent file position is 21774

The raw gmt on my station works just fine.

Any way to fix that?

Hmm, what version of ghostscript do you have installed? Could you please provide the output of:

import pygmt

pygmt.show_versions()

Of course, here you go:

pygmt.show_versions()
PyGMT information:
version: v0.11.0
System information:
python: 3.12.3 | packaged by conda-forge | (main, Apr 15 2024, 18:50:49) [Clang 16.0.6 ]
executable: /Users/pawleeq/miniforge3/envs/pygmt/bin/python
machine: macOS-14.4.1-x86_64-i386-64bit
Dependency information:
numpy: 1.26.4
pandas: 2.2.2
xarray: 2024.3.0
netCDF4: 1.6.5
packaging: 24.0
contextily: None
geopandas: None
ipython: None
rioxarray: None
ghostscript: 10.03.0
GMT library information:
binary version: 6.5.0
cores: 6
grid layout: rows
image layout:
library path: /Users/pawleeq/miniforge3/envs/pygmt/lib/libgmt.dylib
padding: 2
plugin dir: /Users/pawleeq/miniforge3/envs/pygmt/lib/gmt/plugins
share dir: /Users/pawleeq/miniforge3/envs/pygmt/share/gmt
version: 6.5.0

It seems this is the problem, because ghostcript bundled with GMT 6.5.0 is version 10.02.1 apart from 10.03 which is refered by above output. So I tried

conda install ghostscript=10.02.1

to make pygmt work with the same version of ghostscript as GMT app. However, the problem remains the same, maps utilizing fonts are not generated.

Either ghostscript version (10.03.0 or 10.02.1) should be fine. When you say “The raw gmt on my station works just fine”, do you mean running the same code on the same computer works in GMT, but not for PyGMT?

@seisman, do you have any clue about this since you’re using macOS? I saw you had a similar GenericResourceDir error before at Macports now has gs 9.50 so no need to build separately by PaulWessel · Pull Request #1993 · GenericMappingTools/gmt · GitHub. But it shouldn’t be a problem if ghostscript was installed via conda instead of homebrew/macports?

Please double check if your ~/.bashrc or ~/.zshrc files contain settings like

export GS_LIB=$GMTHOME/share/ghostscript/Resource/Init

The above line is required if you use the GMT bundle on macOS, but can cause trouble when you have multiple gs versions installed (one via GMT bundle and another one via conda).

I’ve got this in my .profile. It doesn’t work even when I source it prior to activating pygmt.

By “raw GMT” I mean app downloaded and installed “the mac way”. I install Pygmt via conda and by digging in ~/miniforge3/envs/pygmt I guess it comes with its own gmt and shostscript and so on.

That’s the problem! Comment out that line from your .profile.

Well I’ve looked for this everywhere i could (.profile, .bash_profile, .zshrc) and commented that out. Example script still doesn’t work.

What’s the output if you run gs --help in your terminal?

GPL Ghostscript 10.00.0 (2022-09-21)
Copyright (C) 2022 Artifex Software, Inc.  All rights reserved.
Usage: gs [switches] [file1.ps file2.ps ...]
Most frequently used switches: (you can use # in place of =)
 -dNOPAUSE           no pause after page   | -q       `quiet', fewer messages
 -g<width>x<height>  page size in pixels   | -r<res>  pixels/inch resolution
 -sDEVICE=<devname>  select device         | -dBATCH  exit after last file
 -sOutputFile=<file> select output file: - for stdout, |command for pipe,
                                         embed %d or %ld for page #
Input formats: PostScript PostScriptLevel1 PostScriptLevel2 PostScriptLevel3 PDF
Default output device: x11alpha
Available devices:
   alc1900 alc2000 alc4000 alc4100 alc8500 alc8600 alc9100 ap3250 appledmp
   atx23 atx24 atx38 bbox bit bitcmyk bitrgb bitrgbtags bj10e bj10v bj10vh
   bj200 bjc600 bjc800 bjc880j bjccmyk bjccolor bjcgray bjcmono bmp16 bmp16m
   bmp256 bmp32b bmpgray bmpmono bmpsep1 bmpsep8 ccr cdeskjet cdj1600 cdj500
   cdj550 cdj670 cdj850 cdj880 cdj890 cdj970 cdjcolor cdjmono cdnj500 cfax
   chp2200 cif cljet5 cljet5c cljet5pr coslw2p coslwxl cups declj250 deskjet
   devicen dfaxhigh dfaxlow display dj505j djet500 djet500c dl2100 dnj650c
   docxwrite epl2050 epl2050p epl2120 epl2500 epl2750 epl5800 epl5900
   epl6100 epl6200 eplcolor eplmono eps2write eps9high eps9mid epson epsonc
   escp escpage faxg3 faxg32d faxg4 fmlbp fmpr fpng fs600 gdi hl1240 hl1250
   hl7x0 hocr hpdj1120c hpdj310 hpdj320 hpdj340 hpdj400 hpdj500 hpdj500c
   hpdj510 hpdj520 hpdj540 hpdj550c hpdj560c hpdj600 hpdj660c hpdj670c
   hpdj680c hpdj690c hpdj850c hpdj855c hpdj870c hpdj890c hpdjplus
   hpdjportable ibmpro ijs imagen inferno ink_cov inkcov itk24i itk38 iwhi
   iwlo iwlq jetp3852 jj100 jpeg jpegcmyk jpeggray la50 la70 la75 la75plus
   laserjet lbp310 lbp320 lbp8 lex2050 lex3200 lex5700 lex7000 lips2p lips3
   lips4 lips4v lj250 lj3100sw lj4dith lj4dithp lj5gray lj5mono ljet2p ljet3
   ljet3d ljet4 ljet4d ljet4pjl ljetplus ln03 lp1800 lp1900 lp2000 lp2200
   lp2400 lp2500 lp2563 lp3000c lp7500 lp7700 lp7900 lp8000 lp8000c lp8100
   lp8200c lp8300c lp8300f lp8400f lp8500c lp8600 lp8600f lp8700 lp8800c
   lp8900 lp9000b lp9000c lp9100 lp9200b lp9200c lp9300 lp9400 lp9500c
   lp9600 lp9600s lp9800c lps4500 lps6500 lq850 lxm3200 lxm5700m m8510
   md1xMono md2k md50Eco md50Mono md5k mgr4 mgr8 mgrgray2 mgrgray4 mgrgray8
   mgrmono miff24 mj500c mj6000c mj700v2c mj8000c ml600 necp6 npdl nullpage
   oce9050 ocr oki182 oki4w okiibm oprp opvp paintjet pam pamcmyk32 pamcmyk4
   pbm pbmraw pcl3 pclm pclm8 pcx16 pcx24b pcx256 pcxcmyk pcxgray pcxmono
   pdfimage24 pdfimage32 pdfimage8 pdfocr24 pdfocr32 pdfocr8 pdfwrite pgm
   pgmraw pgnm pgnmraw photoex picty180 pj pjetxl pjxl pjxl300 pkm pkmraw
   pksm pksmraw plan plan9bm planc plang plank planm plib plibc plibg plibk
   plibm png16 png16m png16malpha png256 png48 pngalpha pnggray pngmono
   pngmonod pnm pnmraw ppm ppmraw pr1000 pr1000_4 pr150 pr201 ps2write
   psdcmyk psdcmyk16 psdcmykog psdcmyktags psdcmyktags16 psdrgb psdrgb16
   pwgraster pxlcolor pxlmono r4081 rinkj rpdl samsunggdi sj48 spotcmyk
   st800 stcolor t4693d2 t4693d4 t4693d8 tek4696 tiff12nc tiff24nc tiff32nc
   tiff48nc tiff64nc tiffcrle tiffg3 tiffg32d tiffg4 tiffgray tifflzw
   tiffpack tiffscaled tiffscaled24 tiffscaled32 tiffscaled4 tiffscaled8
   tiffsep tiffsep1 txtwrite uniprint x11 x11alpha x11cmyk x11cmyk2 x11cmyk4
   x11cmyk8 x11gray2 x11gray4 x11mono x11rg16x x11rg32x xcf xes xpswrite
Search path:
   /Applications/GMT-6.4.0.app/Contents/Resources/share/ghostscript/Resource/Init :
   /usr/local/share/ghostscript/10.00.0/Resource/Init :
   /usr/local/share/ghostscript/10.00.0/lib :
   /usr/local/share/ghostscript/10.00.0/Resource/Font :
   /usr/local/share/ghostscript/fonts :
   /usr/local/share/fonts/default/ghostscript :
   /usr/local/share/fonts/default/Type1 :
   /usr/local/share/fonts/default/TrueType : /usr/lib/DPS/outline/base :
   /usr/openwin/lib/X11/fonts/Type1 : /usr/openwin/lib/X11/fonts/TrueType :
   /usr/share/cups/fonts
For more information, see /usr/local/share/doc/ghostscript/10.00.0/Use.htm.
Please report bugs to bugs.ghostscript.com.

This line causes the trouble. It means you still set GS_LIB somewhere.

Yeh, that was it, thank you. (.zshenv was the last file to look at).