virtualenvle permite crear una instalación personalizada de Python, por ejemplo, en un subdirectorio de su proyecto. Cada uno de sus proyectos puede tener su propio python(o incluso varios) bajo su respectivo virtualenv. Está perfectamente bien que algunos / todos los virtualenvs tengan incluso la misma versión de python(por ejemplo, 2.7.16) sin conflicto: viven por separado y no se conocen entre sí. Si desea usar cualquiera de esos pythons, debe activatehacerlo (ejecutando un script que modificará temporalmente su PATHpara asegurarse de que el bin/directorio de virtualenv sea lo primero). A partir de ese momento, llamar python(o pipetc.) invocará la versión de ese virtualenv hasta que deactivatelo restablezca PATH.
pyenvopera en una escala más amplia que virtualenv: contiene un registro de las instalaciones de Python (y puede usarse para instalar otras nuevas) y le permite configurar qué versión de Python ejecutar cuando usa el pythoncomando. Suena similar pero el uso práctico es un poco diferente. Funciona anteponiendo su pythonscript shim a su PATH(permanentemente) y luego decidiendo qué "real" pythoninvocar. Incluso puede configurar pyenv para llamar a una de sus pitones virtualenv (utilizando el pyenv-virtualenvcomplemento). Las versiones de Python que instala usando pyenvvan a su $(pyenv root)/versions/directorio (por defecto, la raíz de pyenv es ~ / .pyenv), por lo que son más 'globales' que virtualenv. Por lo general, no puede duplicar las versiones de Python instaladas pyenv, al menos no es la idea principal.
Para crear un virtualenv con una versión específica de Python, necesita tener esa versión en algún lugar de su sistema (ya sea en el PATHo no) y esencialmente clonarla en su virtualenv recién creado. Por supuesto, una forma de obtener una versión en particular es instalarla a través de pyenv. Una vez hecho esto, los virtualenvs individuales son libres de divergir al tener instalados diferentes módulos (o versiones de los mismos).
En breve:
virtualenv le permite crear instalaciones de python locales e independientes mediante la clonación de las existentes
pyenv le permite instalar diferentes versiones de python simultáneamente (ya sea en todo el sistema o solo para el usuario local) y luego elegir cuál de la multitud de pitones ejecutar en un momento dado (incluidas las creadas por virtualenv o Anaconda)