So, once again, I make a nice python program which makes my life ever the more easier and saves a lot of time. Ofcourse, this involves a virtualenv, made with the mkvirtualenv
function of virtualenvwrapper. The project has a requirements.txt file with a few required libraries (requests too :D) and the program won't run without these libraries.
I am trying to add a bin/run-app
executable shell script which would be in my path (symlink actually). Now, inside this script, I need to switch to the virtualenv before I can run this program. So I put this in
#!/bin/bash
# cd into the project directory
workon "$(cat .venv)"
python main.py
A file .venv
contains the virtualenv name. But when I run this script, I get workon: command not found
error.
Of course, I have the virtualenvwrapper.sh sourced in my bashrc but it doesn't seem to be available in this shell script.
So, how can I access those virtualenvwrapper functions here? Or am I doing this the wrong way? How do you launch your python tools, each of which has its own virtualenv!?
Just source the
virtualenvwrapper.sh
script in your script to import the virtualenvwrapper's functions. You should then be able to use theworkon
function in your script.And maybe better, you could create a shell script (you could name it
venv-run.sh
for example) to run any Python script into a given virtualenv, and place it in/usr/bin
,/usr/local/bin
, or any directory which is in yourPATH
.Such a script could look like this:
And could be used simply like
venv-run.sh my_virtualenv /path/to/script.py
This is a super old thread and I had a similar issue. I started digging for a simpler solution out of curiousity.
The --workingdirectory forces the tab to open there by default under the hood and the -ci forces it to work like an interactive interface, which gets around the issues with the venvwrapper not functioning as expected.
You can run as many of these in sequence. It will open tabs, give them an alias, and run the script you want.
Personally I dropped an alias into my bashrc to just do this when I type startdev in my terminal.
I like this because its easy, simple to replicate, flexible, and doesn't require any fiddling with variables and whatnot.