This article document how I updated python3 from version 3.5 to 3.6 on FreeBSD.
This article is written for FreeBSD 11-STABLE amd64. The procedure on other
supported FreeBSD versions should be similar if not identical. Commands
following a “>” can be run as an unprivileged user. Commands following
a “#” should be run as the
Updating the ports tree
On 2016-12-25, python 3.6 landed in the ports tree. The ports tree was updated as follows.
# svnlite update /usr/ports
There were no relevant notices in
/usr/ports/UPDATING, so I could continue
with the update.
Listing installed python 3.5 ports and modules
First, I determined which python 3.5 ports I had installed.
> pkg info -ox py35
This lists the package and its origin, like this:
py35-Jinja2-2.8 devel/py-Jinja2 py35-MarkupSafe-0.23 textproc/py-MarkupSafe py35-Wand-0.4.4 graphics/py-wand py35-bottle-0.12.7 www/py-bottle py35-cairo-1.10.0_3 graphics/py3-cairo
This list is saved to a file. Next I determined which modules were installed
pip to also find stuff that I had installed without a port.
This was done with the command:
> pip-3.5 list --format=columns
The output of this was appended to the above mentioned file.
Updating python itself
To prevent issues, I removed the python 3.5 packages before updating python.
# pkg delete -x py35
Next, I modified
/etc/make.conf to set python 3.6 as the default version.
-DEFAULT_VERSIONS= ruby=2.1 python3=3.5 ghostscript=agpl ssl=libressl perl5=5.24 +DEFAULT_VERSIONS= ruby=2.1 python3=3.6 ghostscript=agpl ssl=libressl perl5=5.24
To update the port, I used portmaster to update the meta-port.
# portmaster python3-3_3
I choose the same port options for 3.6 as for 3.5. In addition to the default options, I enabled the TSC option and choose the SipHash24 hash algorithm. The portmaster run builds and installs python 3.6. After a successful installation of python 3.6, I deleted the old python 3.5 installation.
# pkg delete python35-3.5.2
Note that this leaves the installed modules that are not ports in
/usr/local/lib/python3.5/site-packages/. This directory should be
During the compilation of the port, I noticed a warning that the
--with-tsc was not recognized. Looking at the output of
--help, it seems that this option is gone. I submitted problem report (“PR”)
215580 to remove it from the port.
Re-installing the python ports
Working from the above mentioned list of ports, I re-installed them. For each port, this went like this.
# cd /usr/port/<category>/<port> # make PYTHON_VERSION=python3.6 install clean
matplotlib port deserves special mention. At the moment this article
was written, this port is marked as python 2.7 only. However, with the correct
back end (TkAgg) it works fine with python 3. In November 2016 I submitted
problem report 214853 about this. Unfortunately this PR is without a complete
working patch because it requires some voodoo that is currently beyond me.
So in the meantime I locally modified the port Makefile to remove the python 2.7 restriction, and compile and install this port with only the TkAgg back end. To prevent problems, I lock this package after it has been successfully installed.
Re-installing python modules
Some modules that I use are not available as ports. Those I generally install
from source. The reason for doing this instead of using
pip is that some
very interesting modules like binwalk and pyknon are not available in ports.
After unpacking the source code, and changing to the source code directory, installation is generally done with.
# python3 setup.py install
- Have Python log to syslog
- Attempting a conky replacement in Python (part 2)
- Attempting a conky replacement in Python (part 1)
- Setting the Razer ornata chroma color from userspace
- Switching IPython to Python 3