I've used virtualenv, pipenv, pyenv, venv, etc.

What the hell is the difference? All that I have used have worked pretty much exactly the same as the others. All work just fine. I've never had a problem. I just use virtualenv since it's the oldest. I see no more reason to switch or try other options as long as it continues to deliver.

"What the hell is the difference?"

One of the big selling points of pipenv is that you can pin the versions of the packages you use and their dependencies.

None of the others do this, afaik.

`pip freeze > requirements.txt`

This assumes semantic versioning and does not actually pin dependencies to the hash of their bytes, like a lockfile does.

`pip-compile --generate-hashes` is the best way to manage python dependencies.

https://github.com/jazzband/pip-tools https://gist.github.com/hynek/5e85706cee589a204251b333595853...