When I’m working on Windows in the repository where I build executables, I’m usually using two types of virtual environments for my Python development.
One is called .venvdev and it’s located in the root of my project. It’s used for development purposes. Another is called .venv, it’s located in the same directory as .venvdev and it’s used for production purposes. Whenever I need to build for example an executable with pyinstaller I’m using this environment. And pyinstaller is bundling all of the installed libraries from the environment to the executable.
Why?
I don’t want to activate .venv environment when I’m developing - because it doesn’t contain linters and formatters. And I don’t want to activate .venvdev when I’m building an executable - because I don’t want to bundle all of the development libraries to the executable.
What?
I’ve created a function in my PowerShell profile which is activating the environment. It’s super simple. But I can also pass the path to the virtual environment as an argument.
So by default - it’s activating .venvdev environment. But when I’m passing .venv as an argument - it’s activating .venv environment.
1
2
activate # will activate .venvdev if it exists, otherwise .venv
activate ../.my_venv # will activate ../.my_venv if it exists, otherwise .venv
How?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function activate {
param (
[string]$venv_path = ".venvdev"
)
if (-not (Test-Path $venv_path)) {
$venv_path = ".venv"
}
$activate_path = Join-Path $venv_path "Scripts\activate"
if (-not (Test-Path $activate_path)) {
Write-Host "No venv found"
return
}
& $activate_path
}
Comments
Post comment