Thank you both for your swift replies!
Here's where my mistake was rooted: I assumed weewx 4.0 only supported Python3, and missed the point that it was written to support both Python2 and Python3 simultaneously. Therefore, I just followed the instructions in 'upgrading.htm' - and assumed that the upgrade steps would upgrade my weewx to one supporting Python3.
But, since weewx supports both, just executing "./setup.py ..." as mentioned in 'upgrading.htm' chooses the python based on the "env python" in the first line of the setup.py script, it meant that a Python2 based upgrade happened, creating binaries that referenced "/usr/bin/python" vs "/usr/bin/python3".
Since the errors reported upon weewx startup (and later, report generation) were so trivial to resolve in a couple of minutes (by just pulling in Cheetah3, PyMysql and Pillow with pip3), I never dug more deeply into the documentation to see what was wrong. It was so easy to resolve.
Most of my time was spent scanning through the weewx-purpleair extension. Since it had been written to support only Python2, I didn't want to make just the syntactic changes, but convince myself that the rest of the script would actually do what was intended. It's a short script - but the reason I am taking a while to send the changes upstream is that I want to see if the divisions (/) in the script should be changed to floor divisions (//) to mimic Python2's behavior - and I want to make sure the results look reasonable over a period of time before suggesting them upstream.
Yes, if I were installing weewx from scratch, the few minutes spent at the start would not have been needed, as the setup.htm documentation does indeed mention python3 compatible packages. :)
Overall, it was a very easy experience, with weewx working flawlessly, with the only possible suggestion from me being this: that there be some sort of text in upgrading.htm about upgrading weewx from python2 to python3.
-Joel