Install and Setup of PyEnv

PyEnv can be installed by downloading from here https://github.com/pyenv/pyenv or if using a mac use brew install pyenv

If downloading from github do the following

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
cd ~/.pyenv && src/configure && make -C src

If using homebrew this will be installed into your homebrew path.

Setting Paths

To get pyenv to work we need to add the bin directory to our PATH. This can be dome by add the following into the ~/.profile

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"

And this in your .bashrc

eval "$(pyenv init --path)"

Checking Versions

To see what versions of python are installed we can use

pyenv versions
* system (set by /home/jmacey/.pyenv/version)

This show the current installed version of python is the system one, we can confirm this by running

python -V
Python 2.7.5

As this is EOL we really need to update and install a better version. The current recommended vfx reference platform version is 3.9.x so lets see what versions we have.

pyenv install --list

Will list all of the version you will see that there are quite a few, lets filter the list a little with grep

pyenv install --list | grep " 3\.[9]"

This gives use a better list, we are going to install the final 3. 9version which is 3.9.7

We can now install using

pyenv install 3.9.7

If we now run

pyenv versions

We can see which versions of python are installed.

Global vs Local

PyEnv allows us to override any system installed python versions by using the version installed in a directory called .pyenv/shims/ these can be made permanent for the users session by using the ```pyenv global`` command.

pyenv global 3.9.7
python -V

It is also possible to setup a per directory local python version by using the pyenv local command. For example

mkdir pytmp
cd pytmp
pyenv local system
python -V

This will work for subfolders and can also be overridden on a per folder basis which is ideal for testing.

Problems

On my mac (M1) I had a few issues, whilst things installed ok when using python 3.7.12 I could not pass all the tests from python -m test there were some failures. However the main issues was when trying to import ctypes which failed with an import error.

 import ctypes
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jmacey/.pyenv/versions/3.7.12/lib/python3.7/ctypes/__init__.py", line 7, in <module>
    from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named '_ctypes'

This seems to be an issue with python 3.7 on pyenv. If I test 3.9.x it all works fine as this is supported by Renderman my main python usage I will just use this.

More Reading

This article has some in depth information about how pyenv works

Next