virtualenvwrapper functions unavailable in shell scripts

前端 未结 8 722
夕颜
夕颜 2020-12-01 03:44

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 mkvi

相关标签:
8条回答
  • 2020-12-01 03:44

    Just source the virtualenvwrapper.sh script in your script to import the virtualenvwrapper's functions. You should then be able to use the workon 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 your PATH.

    Such a script could look like this:

    #!/bin/sh
    # if virtualenvwrapper.sh is in your PATH (i.e. installed with pip)
    source `which virtualenvwrapper.sh`
    #source /path/to/virtualenvwrapper.sh # if it's not in your PATH
    workon $1
    python $2
    deactivate
    

    And could be used simply like venv-run.sh my_virtualenv /path/to/script.py

    0 讨论(0)
  • 2020-12-01 03:46

    You can also call the virtualenv's python executable directly. First find the path to the executable:

    $ workon myenv
    $ which python
    /path/to/virtualenv/myenv/bin/python
    

    Then call from your shell script:

    #!/bin/bash
    
    /path/to/virtualenv/myenv/bin/python myscript.py
    
    0 讨论(0)
  • 2020-12-01 03:49

    I can't find the way to trigger the commands of virtualenvwrapper in shell. But this trick can help: assume your env. name is myenv, then put following lines at the beginning of scripts:

    ENV=myenv
    source $WORKON_HOME/$ENV/bin/activate
    
    0 讨论(0)
  • 2020-12-01 03:53

    This is a super old thread and I had a similar issue. I started digging for a simpler solution out of curiousity.

    gnome-terminal --working-directory='/home/exact/path/here' --tab --title="API" -- bash -ci "workon aaapi && python manage.py runserver 8001; exec bash;"
    

    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.

    0 讨论(0)
  • 2020-12-01 03:53

    Apparently, I was doing this the wrong way. Instead of saving the virtualenv's name in the .venv file, I should be putting the virtualenv's directory path.

    (cdvirtualenv && pwd) > .venv
    

    and in the bin/run-app, I put

    source "$(cat .venv)/bin/activate"
    python main.py
    

    And yay!

    0 讨论(0)
  • 2020-12-01 03:54

    It's a known issue. As a workaround, you can make the content of the script a function and place it in either ~/.bashrc or ~/.profile

    function run-app() {
      workon "$(cat .venv)"
      python main.py
    } 
    
    0 讨论(0)
提交回复
热议问题