Managing Multiple Python Versions With pyenv
Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Start Managing Multiple Python Versions With pyenv
Have you ever wanted to contribute to a project that supports multiple versions of Python but aren’t sure how you would easily test all the versions? Are you ever curious about the latest and greatest versions of Python? Maybe you’d like to try out these new features, but you don’t want to worry about messing up your development environment. Luckily, managing multiple versions of Python doesn’t have to be confusing if you use pyenv .
This article will provide you with a great overview of how to maximize your time spent working on projects and minimize the time spent in headaches trying to use the right version of Python.
In this article, you’ll learn how to:
- Install multiple versions of Python
- Install the latest development version of Python
- Switch between the installed versions
- Use virtual environments with pyenv
- Activate different Python versions and virtual environments automatically
Free Download: Get a sample chapter from Python Tricks: The Book that shows you Python’s best practices with simple examples you can apply instantly to write more beautiful + Pythonic code.
Why Use pyenv ?
pyenv is a wonderful tool for managing multiple Python versions. Even if you already have Python installed on your system, it is worth having pyenv installed so that you can easily try out new language features or help contribute to a project that is on a different version of Python. Using pyenv is also a great way to install pre-release versions of Python so that you can test them for bugs.
Why Not Use System Python?
“System Python” is the Python that comes installed on your operating system. If you’re on Mac or Linux, then by default, when you type python in your terminal, you get a nice Python REPL.
So, why not use it? One way to look at it is that this Python really belongs to the operating system. After all, it came installed with the operating system. That’s even reflected when you run which :
Here, python is available to all users as evidenced by its location /usr/bin/python . Chances are, this isn’t the version of Python you want either:
To install a package into your system Python, you have to run sudo pip install . That’s because you’re installing the Python package globally, which is a real problem if another user comes along and wants to install a slightly older version of the package.
Problems with multiple versions of the same package tend to creep up on you and bite you when you least expect it. One common way this problem presents itself is a popular and stable package suddenly misbehaving on your system. After hours of troubleshooting and Googling, you may find that you’ve installed the wrong version of a dependency, and it’s ruining your day.
Even if your Python version is installed in /usr/local/bin/python3 , you’re still not safe. You will run into the same permissions and flexibility problems described above.
In addition, you don’t really have much control over what version of Python comes installed on your OS. If you want to use the latest features in Python, and you’re on Ubuntu for example, you might just be out of luck. The default versions might be too old, which means you’ll just have to wait for a new OS to come out.
Finally, some operating systems actually use the packaged Python for operation. Take yum for example, which makes heavy use of Python to do its job. If you install a new version of Python and aren’t careful to install it into your user space, you could seriously damage your ability to use your OS.
What About a Package Manager?
The next logical place to look is package managers. Programs such as apt , yum , brew , or port are typical next options. After all, this is how you install most packages to your system. Unfortunately, you’ll find some of the same problems using a package manager.
By default, package managers tend to install their packages into the global system space instead of the user space. Again, these system level packages pollute your development environment and make it hard to share a workspace with others.
Once again, you still don’t have control over what version of Python you can install. It’s true some repositories give you a greater selection, but by default, you’re looking at whatever version of Python your particular vendor is up to on any given day.
Even if you do install Python from a package manager, consider what would happen if you’re writing a package and want to support and test on Python 3.4 — 3.7.
What would happen on your system when you type python3 ? How would you switch quickly between the different versions? You can certainly do it, but it is tedious and prone to error. Nevermind the fact that if you want PyPy, Jython, or Miniconda, then you’re probably just out of luck with your package manager.
With these constraints in mind, let’s recap the criteria that would let you install and manage Python versions easily and flexibly:
- Install Python in your user space
- Install multiple versions of Python
- Specify the exact Python version you want
- Switch between the installed versions
pyenv lets you do all of these things and more.
Installing pyenv
Before you install pyenv itself, you’re going to need some OS-specific dependencies. These dependencies are mostly development utilities written in C and are required because pyenv installs Python by building from source. For a more detailed breakdown and explanation of the build dependencies, you can check out the official docs. In this tutorial, you’ll see the most common ways to install these dependencies.
Note: pyenv did not originally support Windows. However, there appears to be some basic support with the pyenv-win project that recently became active. If you use Windows, feel free to check it out.
Build Dependencies
pyenv builds Python from source, which means you’ll need build dependencies to actually use pyenv . The build dependencies vary by platform. If you are on Ubuntu/Debian and want to install the build dependencies, you could use the following:
This uses Apt to install all the build dependencies. Let this run, and you’ll be ready to go for Debian systems.
If you use Fedora/CentOS/RHEL, you could use yum to install your build dependencies:
This command will install all the build dependencies for Python using yum .
macOS users can use the following command:
This command relies on Homebrew and installs the few dependencies for macOS users.
Tip: When running Mojave or higher (10.14+) you will also need to install the additional SDK headers:
Thanks to Rodrigo Viera for the update.
If you’re instead using openSUSE then you would run the following:
Once again, this command installs all the Python build dependencies for your system.
Finally, for Alpine users, you can use this:
This command uses apk as the package manager and will install all build dependencies for Python on Alpine.
Using the pyenv-installer
After you’ve installed the build dependencies, you’re ready to install pyenv itself. I recommend using the pyenv-installer project:
This will install pyenv along with a few plugins that are useful:
- pyenv : The actual pyenv application
- pyenv-virtualenv : Plugin for pyenv and virtual environments
- pyenv-update : Plugin for updating pyenv
- pyenv-doctor : Plugin to verify that pyenv and build dependencies are installed
- pyenv-which-ext : Plugin to automatically lookup system commands
Note: The above command is the same as downloading the pyenv-installer script and running it locally. So if you’d like to see exactly what you’re running, you can view the file yourself. Alternatively, if you really don’t want to run a script, you can checkout the manual installation instructions.
At the end of the run, you should see something like this:
The output will be based on your shell. But you should follow the instructions to add pyenv to your path and to initialize pyenv / pyenv-virtualenv auto completion. Once you’ve done this, you need to reload your shell:
That’s it. You now have pyenv and four useful plugins installed.
Using pyenv to Install Python
Now that you have pyenv installed, installing Python is the next step. You have many versions of Python to choose from. If you wanted to see all the available CPython 3.6 through 3.8, you can do this:
The above shows all the Python versions that pyenv knows about that match the regular expression. In this case, that is all available CPython versions 3.6 through 3.8. Likewise, if you wanted to see all the Jython versions, you could do this:
Again, you can see all the Jython versions that pyenv has to offer. If you want to see all the versions, you can do the following:
Once you find the version you want, you can install it with a single command:
Having Problems? The pyenv documentation has great installation notes as well as a useful FAQ along with common build problems.
This will take a while because pyenv is building Python from source, but once it’s done, you’ll have Python 3.7.2 available on your local machine. If you don’t want to see all the output, just remove the -v flag. Even development versions of CPython can be installed:
Pro Tip: If you’ve been using pyenv for a while and don’t see the version you’re looking for, you may need to run pyenv update to update the tool and make sure you have access to the latest versions.
For the rest of the tutorial, the examples assume you’ve installed 3.6.8 and 2.7.15 , but you’re free to substitute these values for the Python versions you actually installed. Also note that the system Python version in the examples is 2.7.12 .
Installation Location
As mentioned before, pyenv works by building Python from source. Each version that you have installed is located nicely in your pyenv root directory:
All of your versions will be located here. This is handy because removing these versions is trivial:
Of course pyenv also provides a command to uninstall a particular Python version:
Using Your New Python
Now that you’ve installed a couple of different Python versions, let’s see some basics on how to use them. First, check what versions of Python you have available:
The * indicates that the system Python version is active currently. You’ll also notice that this is set by a file in your root pyenv directory. This means that, by default, you are still using your system Python:
If you try to confirm this using which , you’ll see this:
This might be surprising, but this is how pyenv works. pyenv inserts itself into your PATH and from your OS’s perspective is the executable that is getting called. If you want to see the actual path, you can run the following:
If, for example, you wanted to use version 2.7.15, then you can use the global command:
Pro Tip: A great way to get peace of mind that the version of Python you just installed is working properly is to run the built-in test suite:
This will kick off lots of internal Python tests that will verify your installation. You can just kick back and watch the tests pass.
If you ever want to go back to the system version of Python as the default, you can run this:
You can now switch between different versions of Python with ease. This is just the beginning. If you have many versions that you want to switch between, typing these commands consistently is tedious. This section goes over the basics, but a better workflow is described in working with multiple environments.
Exploring pyenv Commands
pyenv offers many commands. You can see a complete list of all available commands with this:
This outputs all command names. Each command has a —help flag that will give you more detailed information. For example, if you wanted to see more information on the shims command you could run the following:
The help message describes what the command is used for and any options you can use in conjunction with the command. In the following sections, you’ll find a quick, high-level overview of the most used commands.
install
You’ve already seen the install command above. This command can be used to install a specific version of Python. For example, if you wanted to install 3.6.8 you would use this:
The output shows us pyenv downloading and installing Python. Some of the common flags you may want to use are the following:
Flag | Description |
---|---|
-l/—list | Lists all available Python versions for installation |
-g/—debug | Builds a debug version of Python |
-v/—verbose | Verbose mode: print compilation status to stdout |
versions
The versions command displays all currently installed Python versions:
This output shows not only that 2.7.15 , 3.6.8 , 3.8-dev , and your system Python are installed, but also shows you that the system Python is active. If you only care about the current active version, you can use the following command:
This command is similar to versions but only shows you the current active Python version.
which
The which command is helpful for determining the full path to a system executable. Because pyenv works by using shims, this command allows you to see the full path to the executable pyenv is running. For example, if you wanted to see where pip is installed, you could run this:
The output displays the full system path for pip . This can be helpful when you’ve installed command-line applications.
global
The global command sets the global Python version. This can be overridden with other commands, but is useful for ensuring you use a particular Python version by default. If you wanted to use 3.6.8 by default, then you could run this:
This command sets the
/.pyenv/version to 3.6.8 . For more information, see the section on specifying your Python version.
local
The local command is often used to set an application-specific Python version. You could use it to set the version to 2.7.15 :
This command creates a .python-version file in your current directory. If you have pyenv active in your environment, this file will automatically activate this version for you.
shell
The shell command is used to set a shell-specific Python version. For example, if you wanted to test out the 3.8-dev version of Python, you can do this:
This command activates the version specified by setting the PYENV_VERSION environment variable. This command overwrites any applications or global settings you may have. If you want to deactivate the version, you can use the —unset flag.
Specifying Your Python Version
One of the more confusing parts of pyenv is how exactly the python command gets resolved and what commands can be used to modify it. As mentioned in the commands, there are 3 ways to modify which version of python you’re using. So how do all these commands interact with one another? The resolution order looks a little something like this:
This pyramid is meant to be read from top to bottom. The first of these options that pyenv can find is the option it will use. Let’s see a quick example:
Here, your system Python is being used as denoted by the * . To exercise the next most global setting, you use global :
You can see that now pyenv wants to use 3.6.8 as our Python version. It even indicates the location of the file it found. That file does indeed exist, and you can list its contents:
Now, let’s create a .python-version file with local :
Here again, pyenv indicates how it would resolve our python command. This time it comes from
/.python-version . Note that the searching for .python-version is recursive:
Even though there isn’t a .python-version in subdirectory , the version is still set to 2.7.15 because .python-version exists in a parent directory.
Finally, you can set the Python version with shell :
All this did is set the $PYENV_VERSION environment variable:
If you’re feeling overwhelmed by the options, the section on working with multiple environments goes over an opinionated process for managing these files, mostly using local .
Virtual Environments and pyenv
Virtual environments are a big part of managing Python installations and applications. If you haven’t heard of virtual environments before, you can check out Python Virtual Environments: A Primer.
Virtual environments and pyenv are a match made in heaven. pyenv has a wonderful plugin called pyenv-virtualenv that makes working with multiple Python version and multiple virtual environments a breeze. If you’re wondering what the difference is between pyenv , pyenv-virtualenv , and tools like virtualenv or venv , then don’t worry. You’re not alone.
Here’s what you need to know:
- pyenv manages multiple versions of Python itself.
- virtualenv/venv manages virtual environments for a specific Python version.
- pyenv-virtualenv manages virtual environments for across varying versions of Python.
If you’re a die-hard virtualenv or venv user, don’t worry: pyenv plays nicely with either. In fact, you can keep the same workflow you’ve had if you’d prefer, though I think pyenv-virtualenv makes for a nicer experience when you’re switching between multiple environments that require different Python versions.
The good news is that since you used the pyenv-installer script to install pyenv , you already have pyenv-virtualenv installed and ready to go.
Creating Virtual Environments
Creating a virtual environment is a single command:
Technically, the <python_version> is optional, but you should consider always specifying it so that you’re certain of what Python version you’re using.
The <environment_name> is just a name for you to help keep your environments separate. A good practice is to name your environments the same name as your project. For example, if you were working on myproject and wanted to develop against Python 3.6.8, you would run this:
The output includes messages that show a couple of extra Python packages getting installed, namely wheel , pip , and setuptools . This is strictly for convenience and just sets up a more full featured environment for each of your virtual environments.
Activating Your Versions
Now that you’ve created your virtual environment, using it is the next step. Normally, you should activate your environments by running the following:
You’ve seen the pyenv local command before, but this time, instead of specifying a Python version, you specify an environment. This creates a .python-version file in your current working directory and because you ran eval «$(pyenv virtualenv-init -)» in your environment, the environment will automatically be activated.
You can verify this by running the following:
You can see a new version has been created called myproject and the python executable is pointing to that version. If you look at any executable this environment provides, you will see the same thing. Take, for example, pip :
If you did not configure eval «$(pyenv virtualenv-init -)» to run in your shell, you can manually activate/deactivate your Python versions with this:
The above is what pyenv-virtualenv is doing when it enters or exits a directory with a .python-version file in it.
Working With Multiple Environments
Putting everything you’ve learned together, you can work effectively with multiple environments. Let’s assume you have the following versions installed:
Now you want to work on two different, aptly named, projects:
- project1 supports Python 2.7 and 3.6.
- project2 supports Python 3.6 and experiments with 3.8-dev.
You can see that, by default, you are using the system Python, which is indicated by the * in the pyenv versions output. First, create a virtual environment for the first project:
Finally, notice that when you cd out of the directory, you default back to the system Python:
You can follow the above steps and create a virtual environment for project2:
These are one time steps for your projects. Now, as you cd between the projects, your environments will automatically activate:
No more remembering to activate environments: you can switch between all your projects, and pyenv will take care of automatically activating the correct Python versions and the correct virtual environments.
Activating Multiple Versions Simultaneously
As described in the example above, project2 uses experimental features in 3.8. Suppose you wanted to ensure that your code still works on Python 3.6. If you try running python3.6 , you’ll get this:
pyenv informs you that, while Python 3.6 is not available in the current active environment, it is available in other environments. pyenv gives you a way to activate multiple environments at once using a familiar command:
This indicates to pyenv that you would like to use the virtual environment project2 as the first option. So if a command, for example python , can be resolved in both environments, it will pick project2 before 3.6.8 . Let’s see what happens if you run this:
Here, pyenv attempts to find the python3.6 command, and because it finds it in an environment that is active, it allows the command to execute. This is extremely useful for tools like tox that require multiple versions of Python to be available on your PATH in order to execute.
Pro Tip: If you’re using tox and pyenv , you should checkout the tox-pyenv package.
Suppose that in the above example, you’ve found a compatibility problem with your library and would like to do some local testing. The testing requires that you install all the dependencies. You should follow the steps to create a new environment:
Once you’re satisfied with your local testing, you can easily switch back to your default environment:
Conclusion
You can now more easily contribute to a project that wants to support multiple environments. You can also more easily test out the latest and greatest Python versions without having to worry about messing up your development machine, all with a wonderful tool: pyenv .
You’ve seen how pyenv can help you:
- Install multiple versions of Python
- Switch between the installed versions
- Use virtual environments with pyenv
- Activate different Python versions and virtual environments automatically
If you still have questions, feel free to reach out either in the comments section or on Twitter. Additionally, the pyenv documentation is a great resource.
Bonus: Displaying Your Environment Name in Your Command Prompt
If you’re like me and constantly switching between various virtual environments and Python versions, it’s easy to get confused about which version is currently active. I use oh-my-zsh and the agnoster theme, which by default makes my prompt look like this:
At a glance, I don’t know which Python version is active. To figure it out, I would have to run python -V or pyenv version . To help reduce my time spent on figuring out my active Python environment, I add the pyenv virtual environment I’m using to my prompt:
My Python version in this case is project1-venv and is displayed immediately at the beginning of the prompt. This allows me to quickly see what version of Python I’m using right away. If you’d like to use this too, you can use my agnoster-pyenv theme.
Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Start Managing Multiple Python Versions With pyenv
Get a short & sweet Python Trick delivered to your inbox every couple of days. No spam ever. Unsubscribe any time. Curated by the Real Python team.
About Logan Jones
Hi, I'm Logan, an open source contributor, writer for Real Python, software developer, and always trying to get better. Feel free to reach out and let's get better together!
Each tutorial at Real Python is created by a team of developers so that it meets our high quality standards. The team members who worked on this tutorial are:
Master Real-World Python Skills With Unlimited Access to Real Python
Join us and get access to thousands of tutorials, hands-on video courses, and a community of expert Pythonistas:
Master Real-World Python Skills
With Unlimited Access to Real Python
Join us and get access to thousands of tutorials, hands-on video courses, and a community of expert Pythonistas:
What Do You Think?
What’s your #1 takeaway or favorite thing you learned? How are you going to put your newfound skills to use? Leave a comment below and let us know.
Commenting Tips: The most useful comments are those written with the goal of learning from or helping out other students. Get tips for asking good questions and get answers to common questions in our support portal. Looking for a real-time conversation? Visit the Real Python Community Chat or join the next “Office Hours” Live Q&A Session. Happy Pythoning!
Использование нескольких версий Python на unix-подобных операционных системах
Python как язык постоянно развивается. Ветка Py2 уже не поддерживается официально. Однако до сих пор существуют окружения, где приходится использовать Py2 и даже не свежий 2.7.x, а что-то постарее. Да и Python 3.x нынче — это большое семейство версий, кое-где несовместимых между собой, в т.ч. и синтаксически! Поэтому практикующий питонист широкого профиля должен понимать, как на одной машине иметь несколько версий среды исполнения. Даже если "в продакшне" и используется какой-нибудь Docker!
Установка Python из репозиториев пакетов операционной системы
Если вам повезло, то в репозитории пакетов ОС будет нужная версия Python, и вы сможете её установить с помощью команды вроде sudo apt-get install python3.5 . Однако достаточно старые дистрибутивы ОС могут не содержать новых версий Python, а достаточно новые дистрибутивы — старых версий Python. В особых случаях репозиторий вообще может содержать только одну версию среды исполнения.
Сборка из исходного кода
CPython — проект с исходным кодом. Доступ к исходному коду всех версий CPython позволяет собрать нужную версию самостоятельно. Однако это процесс, пусть и достаточно хорошо документирован, но всё же требует понимания того, что вам может потребоваться для компиляции кода под вашу операционную систему.
А ещё сборка из исходного кода — это единственный вариант для тех, кто хочет что-то в этом самом коде изменить или скомпилировать интерпретатор для какой-то экзотической платформы (встраиваемые системы, ретро-железо).
pyenv
Ещё одним из способов получения разных версий среды исполнения на одной машине является pyenv. Это "менеджер версий", выполненный в стиле rbenv для Ruby, nvm для NodeJS и т.п.
Миссия pyenv — управлять установленными версиями Python и делать некую версию "активной". Активная версия вызывается, если мы выполняем команду python (а также pip ), при этом разные проекты могут использовать разные активные версии и даже более чем одну одновременно. Последнее свойство полезно авторам библиотек, рассчитанных на широкий круг пользователей — таковые всегда нужно тестировать на разных версиях Python.
Установить pyenv достаточно просто, ведь инструмент представляет собой набор shell scripts. Именно поэтому получился pyenv максимально кроссплатформенным. Но за эту кроссплатформенность приходится платить тем, что каждую версию среды исполнения нужно компилировать из исходного кода! Для компиляции того же CPython потребуется компилятор Си ( gcc на Linux и clang на MacOS), и заголовочные файлы для библиотек, которые использует интерпретатор. Полный список пререквизитов для сборки приходится гуглить.
Установка системным пакетным менеджером из сторонних источников
Для большинства Unix-like ОС, помимо официальных репозиториев, существуют и неофициальные источники пакетов.
Для Debian-like систем, таких как Ubuntu и её производные, сторонние источники пакетов называются PPA, Personal Package Archives. Подключить любой PPA достаточно просто, но нужно понимать, что вы таким образом соглашаетесь на установку пакетов из стороннего источника, никак не подчиняющегося авторам дистрибутива ОС! Подключайте только хорошо зарекомендовавшие себя PPA, например от самих авторов ПО, которое вы хотите установить!
Для Ubuntu-based систем существует PPA от команды «deadsnakes». Это проверенный источник пакетов с самыми разными версиями Python как для свежих релизов ОС, так и для релизов "второй свежести".
Главное преимущество установки пакетов из проверенных PPA состоит в том, что пакеты обычно содержат оптимизированные под конкретный дистрибутив сборки с должным количеством обновлений и исправлений. Такие сборки более безопасны и производительны, чем те, что собраны вручную из исходников.
К тому же в популярных PPA пакеты обновляются своевременно, чего нельзя сказать про пакеты для устаревших релизов ОС, для которых срок поддержки закончился. Конечно, такие релизы лучше вообще не использовать (небезопасно!), но иногда может не быть выбора, а с PPA вы хотя бы будете иметь свежие версии среды исполнения.
Псевдонимы python , python2 , python3
Исторически сложилось так, что интерпретатор Python запускается командой python . Но в какой-то момент случились Python3, обратная несовместимость, "разброд и шатания". Чтобы внести некоторую определённость, был представлен PEP-394: The "python" Command on Unix-Like Systems. Однако даже этот PEP разрешает разным системам самим выбирать, использовать ли Py2 и Py3 вместе или выбрать что-то одно. Системы должны лишь обеспечить, чтобы
- команда python2 вызывала некую версию Python 2.x, если таковая вообще предоставляется;
- команда python3 вызывала некую версию Python 3.x, если таковая предоставляется;
- команда python соответствовала либо python2 , либо python3 (но не ссылалась на какую-то "третью" версию рантайма).
При этом не гарантируется, что все эти команды будут присутствовать в конкретном случае: где-то будет доступна только команда python3 , где-то — python2 . Псевдоним python вообще обязан присутствовать лишь в виртуальном окружении и всегда соответствовать той версии интерпретатора, которая была выбрана при создании окружения.
Такое "разнообразие" сильно усложняет жизнь разработчикам ПО, особенно — авторам инструментов разработки! Разработчик может написать скрипт для Py2 и указать в shebang #!/usr/bin/env python . Но на одних ОС команда python вообще не будет доступна и скрипт просто не запустится, а на других python будет означать какой-нибудь Python 3.8 и скрипт может даже запуститься, но сломается в процессе выполнения.
И даже если автор использует техники, позволяющие писать портируемый код (six, 3to2), умеющий выполняться и на Py2, и на Py3, всё равно непонятно что же указать в shebang!
Вышеупомянутый PEP советует
- либо фиксировать версию явно (только Py2 или только Py3),
- либо требовать использования виртуальных окружений (в ВО всегда будет доступна команда python )
- либо не писать shebang руками, а вместо этого использовать средства setuptools или другой системы пакетирования, создающие точки входа в зависимости при установке пакета (у точек входа shebang будет правильный).
Установка poetry на системы с разными версиями Python
На момент написания статьи poetry (это такой менеджер виртуальных окружений, сборщик пакетов и проч — "швейцарский нож" разработчика на Python) страдал от проблем с версиями рантайма: при установке рекомендованными способом скрипт-установщик завершался с ошибкой, либо установка проходила успешно, но затем не работала сама программа.
Дело (было?) в том, что и в скрипте-установщике и в точках входа в программу в shebang прописан python ! Сама программа работает и на Py2, и на Py3, но авторы исходили из предположения, что на целевой системе в любом случае будет присутствовать псевдоним python , вызывающий тот или иной интерпретатор. На некоторых системах такой команды нет…
Если использовать pyenv, оный всегда предоставляет команду python и poetry "просто работает". Нет проблем и на старых дистрибутивах, где ещё не отказались окончательно от Py2 . И конечно всё работает в виртуальном окружении. Рассмотрим этот вариант поподробнее.
Установка в выделенное виртуальное окружение
Для начала нам понадобится само окружение. Предположим, что Python3 вы уже так или иначе поставили. Делаем раз
Программа установлена! Теперь создаём символическую ссылку на точку входа в папке, видимой в PATH , например, в $HOME/.local/bin :
Работает! Обновлять программу в будущем можно с помощью того же pip (который в окружении). А можно и вовсе автоматизировать процесс установки такого вот Python-софта с помощью pipx.
Особенности использования poetry, установленного в виртуальное окружение
Poetry построен так, чтобы работать с абстрактной версией python. Поэтому он хорошо сочетается с pyenv: один на себя берёт управление разными пайтонами, а другой — проектами на этих пайтонах.
Но эта привязка к команде python немного мешает, когда poetry установлен в своём собственном виртуальном окружении: в этом окружении Python уже известен и не может быть изменён. Данная особенность упомянута в документации к poetry, так что это "не баг, а фича". И всё же есть способ обойти сие ограничение: можно инициализировать окружение вручную с нужной версией Python и настроить poetry на использование этого готового окружения.
Для начала учим poetry создавать окружения не в своём кэше, а в папке с проектом:
С этих пор для каждого проекта виртуальное окружение будет располагаться в поддиректории .venv .
Уже в конкретном проекте инициализируем окружение командой
(для Py2 команда будет другой, т.к. модуль venv тогда ещё не поставлялся вместе со средой исполнения).
Теперь можно работать с poetry как обычно. Несмотря на то, что Python в проекте, возможно, отличается от рантайма, запускающего poetry!
pyenv-win
pyenv for Windows. pyenv is a simple python version management tool. It lets you easily switch between multiple versions of Python. It’s simple, unobtrusive, and follows the UNIX tradition of single-purpose tools that do one thing well.
Installation
Currently we support following ways, choose any of your comfort:
-
— easiest way — default way + adding manual settings — manual installation — for existing users
Hurray! When you are done here are steps to Validate installation
NOTE: If you are running Windows 10 1905 or newer, you might need to disable the built-in Python launcher via Start > “Manage App Execution Aliases” and turning off the “App Installer” aliases for Python
PowerShell
The easiest way to install pyenv-win is to run the following installation command in a PowerShell terminal:
If you are getting any UnauthorizedAccess error as below then start Windows PowerShell with the “Run as administrator” option and run Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine , now re-run the above installation command.
For more information on ‘digitally signed’ or ‘Security warning’ you can refer to following issue #332
Installation is complete!
Git Commands
The default way to install pyenv-win, it needs git commands you need to install git/git-bash for windows
If you are using PowerShell or Git Bash use $HOME instead of %USERPROFILE%
git clone using command prompt git clone https://github.com/pyenv-win/pyenv-win.git «%USERPROFILE%\.pyenv»
Note: Don’t forget the check above link, it contains final steps to complete.
Installation is complete!
Pyenv-win zip
Manual installation steps for pyenv-win
If you are using PowerShell or Git Bash use $HOME instead of %USERPROFILE%
Create a .pyenv directory using command prompt mkdir %USERPROFILE%/.pyenv if not exist
Extract and move files to %USERPROFILE%\.pyenv\
Ensure there is a bin folder under %USERPROFILE%\.pyenv\pyenv-win
Note: Don’t forget the check above link, it contains final steps to complete.
Installation is complete!
Python pip
For existing python users
Command prompt
pip install pyenv-win —target %USERPROFILE%\\.pyenv
If you run into an error with the above command use the folllowing instead (#303):
pip install pyenv-win —target %USERPROFILE%\\.pyenv —no-user —upgrade
PowerShell or Git Bash
Use the same command as above, but replace %USERPROFILE% with $HOME .
Final steps
Installation should then be complete!
Chocolatey
This needs choco commands to install, installation link
Chocolatey command choco install pyenv-win
Installation is complete!
Add System Settings
It’s a easy way to use PowerShell here
Adding PYENV, PYENV_HOME and PYENV_ROOT to your Environment Variables
Now adding the following paths to your USER PATH variable in order to access the pyenv command
Менеджер версий python
Иногда полезно держать несколько версий python на одной машине. Допустим для разработки двух проектов нам необходима вторая и третья ветка python. Или вы поддерживаете проект который использует старую версию python.
Обычно для этого мы используем виртуальное окружение virtualenv или же обертку для него virtualenvwrapper. Об этом я рассказывать не буду, так как есть уже много подобных статей, да и в документациях к самим утилитам все очень хорошо объяснено. Достаточно только забить virtualenv или virtualenvwrapper в поисковик.
Но в дополнение к ним я хочу рассказать в этой статье про менеджер версий python. Кому любопытно прошу под кат.
Чтобы использовать несколько версий python, можно установить их вручную или воспользоваться менеджер версий. Таких есть два: pythonbrew(который более не развивается) и pyenv. Оба менеджера не поддерживают windows(pythonbrew, pyenv) так что питонистам пишущим на этой платформе, придется пока разруливать все руками, либо сделать свою утилиту для смены путей до нужных версий. Кто как справляется с данной ситуацией можете оставлять в комментариях.
Так как pythonbrew более не поддерживается в этой статье он рассмотрен не будет.
P.S. В статье приведены примеры проверенные для OS Ubuntu 12.04. При попытке повторить их, делайте поправки относительно своего дистрибутива.
Ручной способ
Для того чтобы работать с несколькими версиями питона, можно установить необходимые версии в указанный префикс. Например чтобы не мудрить с правами, установим дополнительно 2 версии python(2.7.6 и 3.3.2) в директорию пользователю:
2.7.6
для 3.3.2 делаем аналогичные операции:
Теперь можно создать виртуальное окружение чтобы использовать эти версии:
или через virtualenvwrapper:
Собственно на основании такого способа описана статья по созданию мультихостинга.
Далее если вам необходимо использовать какую-то из этих версий как python по умолчанию, то вам необходимо добавить в переменную окружения путь до интерпретатора python.
Соответственно вместо bashrc вы ставите bash_profile, zshrc, kshrc, profile в зависимости от вашей командной оболочки.
И по необходимости можно установить pip, предварительно установив setuptools.
Фух, ну вроде бы все. А теперь о том как можно сделать это проще использую менеджер версий python.
PyEnv
В общем если вы достаточно ленивы, то можно не делать всего того что описано выше а воспользоваться утилитой pyenv, которая упростит вам данное взаимодействие с окружением и путями.
- Let you change the global Python version on a per-user basis.
- Provide support for per-project Python versions.
- Allow you to override the Python version with an environment variable.
- Search commands from multiple versions of Python at a time. This may be helpful to test across Python versions with tox.
/.pyenv/versions/ . Изменять версии Python можно как в глобальном контексте так и в локальном(например под конкретный проект).
Как ставить pyenv хорошо описывается в инструкции. Так же у автора есть скрипт который по мимо самой pyenv ставит еще и дополнительные плагины, в том числе и для virtualenv. Есть возможность установить плагин и для virtualenvwrapper.
Прежде чем начать установку, убедитесь, что у вас установлен git:
Далее устанавливаем по инструкции:
Во втором случае установка произойдет с дополнительными плагинами.
Далее, для того чтобы все заработало, дополним наш bashrc и перезагрузим оболочку:
Для обновления утилиты или смены ее версии используем git.
Для управления версиями pyenv необходимо перейти в директорию с утилитой:
Для просмотра доступных версий:
для смены версии
Пример использования
В добавок ко всему все довольно подробно и детально расписано у автора проекта в его репозиториях на github.
Виртуальное окружение
Все, а дальше как хотите. Если вы используете 3 ветку python то для создания виртуального окружения можно воспользоваться утилитой venv которая работает из коробки. Про это есть статья на хабре. Если вы больше привыкли к virtualenv или ее обертке virtualenvwrapper то тут есть два варианта: либо поставить плагин к pyenv, или использовать их к той версии python c которой вы работаете. Соответственно если выбрать первый вариант, то созданные вами окружения будут добавлены к вашим версиям python и доступны через команду:
Добавить плагин легко, просто клонируем его из репозитория pyenv-virtualenv или pyenv-virtualenvwrapper:
Пример использования можно посмотреть в документации для pyenv-virtualenv и pyenv-virtualenvwrapper.
Все, а дальше пользуйтесь, как вам привычнее.
Пример использования
Теперь находясь в директории проекта можно запускать скрипт от нужной версии python не прилагая никаких действий. pyenv создает в директории файл .python-version который содержит в себе информацию о том какую версию python с каким окружение использовать для данного проекта.