Moving from Pipenv to Poetry

PIpenv has been my go-to tool for managing Python projects for many a year. But it's getting quite long in the tooth, and it's time to switch. Here's my "Pipenv workflow" and how I might accomplish the same with Poetry:

Creating a new project

Both poetry and Pipenv can do this for me. However, I prefer to do it myself so I have full control of the location of the environment, python version used, etc. I use pyenv to manage the available python versions on my computer.

# Pipenv workflow:
PYENV_VERSION=3.10.7 python3 -m venv .venv
PIPENV_VENV_IN_PROJECT=1 pipenv install -d

# Poetry workflow:
PYENV_VERSION=3.10.7 python3 -m venv .venv
poetry init --no-interaction
poetry config true
poetry install --no-root

Both of these will set up a virtualenv in repo root (remember to add ".venv" to ".gitignore")

Install a dependency

# Pipenv workflow:
pipenv install requests

# Poetry workflow:
poetry add requests=*

Use an internal feed for internal packages

We use AWS CodeArtifact for some private python packages.

# Pipenv way of adding an internal package repo, add this to Pipfile:

name = 'internal'
url = 'https://aws:[email protected]'
verify_ssl = true

# Poetry way of doing the same, add this to pyproject.toml:

name = "internal"
url = ""
secondary = true

Pipenv will replace environments variables (prefixed with an "$") with their value, so as long as I have an environment variable called "CODEARTIFACT_AUTH_TOKEN" when I run "pipenv install" I will be fine.

Poetry is a bit more intricate, it requires me to use environment variables tailored for the source in question. This is both good and bad I guess, but I need these for my example to work:

export POETRY_HTTP_BASIC_INTERNAL_USERNAME=aws  # will always be "aws"

Notice that the name of the source in pyproject.toml has to match the name of the environment variables.

Install a dependency from an internal feed

Pipenv workflow:
# Add this to Pipfile:
"my-internal-package" = {index="internal"}
# Then run:
pipenv install

Poetry workflow:
# Add this to pyproject.toml:
my-internal-package = {version = "*", source = "internal"}
# Then run
poetry install --no-root