How can I activate virtualenv in a Makefile?
I have tried:
venv:
@virtualenv venv
active:
@source venv/bin/activate
And I've also tried:
active:
@. venv/bin/activate
and it doesn't activate virtualenv.
How can I activate virtualenv in a Makefile?
I have tried:
venv:
@virtualenv venv
active:
@source venv/bin/activate
And I've also tried:
active:
@. venv/bin/activate
and it doesn't activate virtualenv.
Here's how to do it:
You can execute a shell command in a Makefile using ();
E.g.
echoTarget:
(echo "I'm an echo")
Just be sure to put a tab character before each line in the shell command. i.e. you will need a tab before (echo "I'm an echo")
Here's what will work for activating virtualenv:
activate:
( \
source path/to/virtualenv/activate; \
pip install -r requirements.txt; \
)
UPD Mar 14 '21
One more variant for pip install
inside virtualenv:
# Makefile
all: install run
install: venv
: # Activate venv and install smthing inside
. venv/bin/activate && pip install -r requirements.txt
: # Other commands here
venv:
: # Create venv if it doesn't exist
: # test -d venv || virtualenv -p python3 --no-site-packages venv
test -d venv || python3 -m venv venv
run:
: # Run your app here, e.g
: # determine if we are in venv,
: # see https://stackoverflow.com/q/1871549
. venv/bin/activate && pip -V
: # Or see @wizurd's answer to exec multiple commands
. venv/bin/activate && (\
python3 -c 'import sys; print(sys.prefix)'; \
pip3 -V \
)
clean:
rm -rf venv
find -iname "*.pyc" -delete
So you can run make
with different 'standard' ways:
make
- target to default all
make venv
- to just create virtualenvmake install
- to make venv and execute other commandsmake run
- to execute your app inside venvmake clean
- to remove venv and python binariesMakefiles can't activate an environment directly. This is what worked for me:
activate:
bash -c "venv/bin/activate"
If you get a permission denied error make venv/bin/activate executable:
chmod +x venv/bin/activate
When it is time to execute recipes to update a target, they are executed by invoking a new sub-shell for each line of the recipe. --- GNU Make
Since each line of the recipe executes in a separate sub-shell, we should run the python code in the same line of the recipe.
Simple python script for showing the current source of python environment (filename: whichpy.py
):
import sys
print(sys.prefix)
Running python virtual environment (Make
recipes run on sh
instead of bash
, using .
to activate the virtual environment is the correct syntax):
test:
. pyth3.6/bin/activate && python3.6 whichpy.py
. pyth3.6/bin/activate; python3.6 whichpy.py
Both the above 2 recipes are acceptable and we are free to use backslash/newline to separate one recipe into multiple lines.