python-poetry / poetry-plugin-shell

MIT License
0 stars 1 forks source link

Poetry shell command does not start shell #21

Open brianbruggeman opened 4 years ago

brianbruggeman commented 4 years ago

Issue

The basic issue is that poetry shell cannot be invoked within a virtual environment. Based on how this runs, I think the expectation is that we install poetry into the system.

My expectation is that I can invoke a poetry shell and drop into a standard virtual environment (i.e. a subshell that runs similar to vex).

Reproduceable steps:

`which python3` -m venv ~/.test-venv
. ~/.test-venv/bin/activate
pip install --upgrade pip poetry
deactivate
~/.test-venv/bin/poetry shell

The error will be something like:

Skipping virtualenv creation, as specified in config file.
Virtual environment already activated: ~/.test-venv

However, the virtual environment is not active.

KGB33 commented 4 years ago

I'm a bit confused as to what you're trying to accomplish.

If your .test-venv is the virtualenv for a project you could activate it without using poetry (. ~/.test-venv/bin/activate). Then use poetry's package management commands as usual, (ie not poetry run or poetry shell).

If your .test-venv is where your "system-level" poetry is installed and you're trying to start a new project you could do ~/.test-venv/bin/poetry new new_project_name. This would create a new virtualenv for this project, however, you would still have to activate using the above method.

Or are you trying to create a new blank virtual environment without a pyproject.toml? Something like vex foo or python -m venv foo?

One possible solution for the first two is to change this line in poetry/console/commands/shell.py so that it checks if poetry is running from the project's virtualenv or it's "system-level" virtualenv. Maybe by setting the "system-level" venv path as a config option?

I believe the last option would require poetry to become a packaging, dependency, and virtualenv manager by taking on some of the features of vex. Possibly through a new command, something like poetry venv foo would be equivalent to python -m venv foo; . foo/bin/activate or vex foo.

If the core team is interested in either of these solutions I'd be happy to try to implement them.

brianbruggeman commented 4 years ago

My motivation:

Our standard practice is to create a virtual environment independent of whether or not a package exists. From a higher level, virtual environments should generally be ephemeral. If I need to test that a package installs correctly, I want the ability to spin up a new environment and check out the installation. I think that this should be pretty common in a CI environment. And it may be especially relevant when building docker images with multiple stages.

So in answer to your question: yes, I wanted a completely empty virtual environment. And yes, I don't really want to have to install poetry at the system level. Without taking care to specifically control the virtual settings, poetry already creates a virtual environment to install when run from a "system level". So I think poetry already manages virtual environments, to a degree. But I think right now poetry is opinionated in that it assumes that poetry is installed to the system. I'm proposing that we make poetry a little more ergonomic for environments that don't want to support poetry as a system level dependency.

whoizit commented 4 years ago
$ poetry shell -vvv
Using virtualenv: /home/user/.cache/pypoetry/virtualenvs/audition-r4d38FOu-py3.8
Spawning shell within /home/user/.cache/pypoetry/virtualenvs/audition-r4d38FOu-py3.8
audition $ . /home/user/.cache/pypoetry/virtualenvs/audition-r4d38FOu-py3.8/bin/activate
bash: /home/user/.cache/pypoetry/virtualenvs/audition-r4d38FOu-py3.8/bin/activate: line 35: syntax error near unexpected token `}'
bash: /home/user/.cache/pypoetry/virtualenvs/audition-r4d38FOu-py3.8/bin/activate: line 35: `}'
whoizit commented 4 years ago

strange

$ exit
$ python -m venv .venv
$ echo $SHELL
/bin/bash
$ source .venv/bin/activate
bash: .venv/bin/activate: line 35: syntax error near unexpected token `}'
bash: .venv/bin/activate: line 35: `}'

$ bash --version
GNU bash, version 5.0.18(1)-release (x86_64-alpine-linux-musl)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
whoizit commented 4 years ago

oh, it's still happens python-poetry/poetry#2478

dimbleby commented 2 years ago

As you note, this is a duplicate of python-poetry/poetry#2478. And as https://github.com/python-poetry/poetry-plugin-shell/issues/21 seems to show that you can reproduce it without poetry being involved: looks like nothing to do with poetry.