Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Poetry doesn't use the correct version of Python

I've recently installed both Pyenv and Poetry and want to create a new Python 3.8 project. I've set both the global and local versions of python to 3.8.1 using the appropriate Pyenv commands (pyenv global 3.8.1 for example). When I run pyenv version in my terminal the output is 3.8.1. as expected.

Now, the problem is that when I create a new python project with Poetry (poetry new my-project), the generated pyproject.toml file creates a project with python 2.7:

[tool.poetry]
name = "my-project"
version = "0.1.0"
description = ""
authors = ["user <[email protected]>"]

[tool.poetry.dependencies]
python = "^2.7"

[tool.poetry.dev-dependencies]
pytest = "^4.6"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

It seems that Poetry defaults back to the system version of Python. How do I change this so that it uses the version installed with Pyenv?

Edit

I'm using MacOS, which comes bundled with Python 2.7. I think that might be causing some of the issues here. I've reinstalled Python 3.8 again with Pyenv, but when I hit Poetry install I get the following error:

The currently activated Python version 2.7.16 is not supported by the project (^3.8).
Trying to find and use a compatible version.

[NoCompatiblePythonVersionFound]
Poetry was unable to find a compatible version. If you have one, you can explicitly use it via the "env use" command. 

Should I create an environment explicitly for the project using Pyenv or should the project be able to access the correct Python version after running pyenv local 3.8.1.? When I do the latter, nothing changes and I still get the same errors.

like image 587
P4nd4b0b3r1n0 Avatar asked Jan 19 '20 13:01

P4nd4b0b3r1n0


People also ask

Which version of Python does poetry use?

This chapter will tell you how to make your library installable through Poetry. Versioning Poetry requires PEP 440-compliant versions for all projects. While Poetry does not enforce any release convention, it does encourage the use of semantic versioning within the scope of PEP 440.

Does poetry manage Python versions?

Poetry will then try to find the current python of your shell. Since version 1.2, Poetry no longer supports managing environments for Python 2.7.

How do I run a Python file from poetry?

To run your script simply use poetry run python your_script.py . Likewise if you have command line tools such as pytest or black you can run them using poetry run pytest .

How does poetry work Python?

Poetry helps you declare, manage and install dependencies of Python projects, ensuring you have the right stack everywhere. It supports Python 2.7 and 3.5+. Note: Python 2.7 and 3.5 will no longer be supported in the next feature release (1.2). You should consider updating your Python version to a supported one.


5 Answers

pyproject.toml is used to define all the dependencies for your project, including the supported python version.

The line your complaining about is just saying that the versions of python supported by the project is python2.7 or greater, this is independent of what versions of python you've installed with pyenv.

python = "^2.7"

If you want to update the versions of python supported by the project you can edit the file directly and run poetry update.


If you want to use multiple versions of python you need to make sure poetry is using the correct dependencies for the version of python you are using. To change the specific version poetry is using you should use poetry env,

  • poetry env list show the versions of python poetry can use
  • poetry env use <python> switches poetry to use that version.

For instance on my machine poetry has 3 virtual environments installed and is using the one associated with python3.6:

↪ poetry env list
sipy-a9sqc5pb-py3.6 (Activated)
sipy-a9sqc5pb-py3.7
sipy-a9sqc5pb-py3.8

I'm not sure how these virtual environments with interact with the shivs used by pyenv but their docs have a section relating to it

Managing Virtual Environments

There is a pyenv plugin named pyenv-virtualenv which comes with various features to help pyenv users to manage virtual environments created by virtualenv or Anaconda. Because the activate script of those virtual environments are relying on mutating $PATH variable of user's interactive shell, it will intercept pyenv's shim style command execution hooks. We'd recommend to install pyenv-virtualenv as well if you have some plan to play with those virtual environments.

like image 199
Sam Broster Avatar answered Nov 08 '22 15:11

Sam Broster


Alright, I figured the problem. A little embarrassingly, I had not run pyenv shell 3.8.1 before running any of the other commands. Everything works now. Thank you all for your efforts.

like image 26
P4nd4b0b3r1n0 Avatar answered Nov 08 '22 16:11

P4nd4b0b3r1n0


you can specify an explicit python executable for poetry using

poetry env use <path to python executable>

This worked for me.

like image 34
Jan Avatar answered Nov 08 '22 15:11

Jan


On my machine I was able to fix the "currently activated Python version is not supported by the project" error by reinstalling Poetry:

curl -sSL https://install.python-poetry.org | python3 - --uninstall
curl -sSL https://install.python-poetry.org | python3 -

After that,poetry was able to find the correct version installed by pyenv.

like image 34
Jace Browning Avatar answered Nov 08 '22 16:11

Jace Browning


In my case, I had to delete and recreate the virtualenv used by poetry. This is because I added the python version restrictions (e.g. python = ">=3.6.2 <3.7") after creating the virtualenv.

Steps

  • Delete the original one: run poetry env remove myApp-XkghI9p6-py3.6
  • Run any poetry step, to create it, or run poetry shell, and confirm poetry run python --version is the correct version.
like image 25
Ben Butterworth Avatar answered Nov 08 '22 16:11

Ben Butterworth