paula.em.lafon
paula.em.lafon

Reputation: 591

Unable to activate virtualenv via bash script

I'm running a project inside a virtualenv in python. Here's the path to the virtualenv.

~/iss/issp/bin

The problem is when I try to run the activate script with:

source activate

it throws the following error.

:~/iss/issp/bin$ source activate
: command not found
bash: activate: line 4: syntax error near unexpected token `$'{\r''
'ash: activate: line 4: `deactivate () {

Here's the code inside the script:

# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly

deactivate () {
    unset pydoc

    # reset old environment variables
    if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
        PATH="$_OLD_VIRTUAL_PATH"
        export PATH
        unset _OLD_VIRTUAL_PATH
    fi
    if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then
        PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
        export PYTHONHOME
        unset _OLD_VIRTUAL_PYTHONHOME
    fi

    # This should detect bash and zsh, which have a hash command that must
    # be called to get it to forget past commands.  Without forgetting
    # past commands the $PATH changes we made may not be respected
    if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
        hash -r 2>/dev/null
    fi

    if [ -n "$_OLD_VIRTUAL_PS1" ] ; then
        PS1="$_OLD_VIRTUAL_PS1"
        export PS1
        unset _OLD_VIRTUAL_PS1
    fi

    unset VIRTUAL_ENV
    if [ ! "$1" = "nondestructive" ] ; then
    # Self destruct!
        unset -f deactivate
    fi
}

# unset irrelevant variables
deactivate nondestructive

VIRTUAL_ENV="/home/pablo/issp"
export VIRTUAL_ENV

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
if [ -n "$PYTHONHOME" ] ; then
    _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
    unset PYTHONHOME
fi

if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
    _OLD_VIRTUAL_PS1="$PS1"
    if [ "x" != x ] ; then
        PS1="$PS1"
    else
    if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
        # special case for Aspen magic directories
        # see http://www.zetadev.com/software/aspen/
        PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
    else
        PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
    fi
    fi
    export PS1
fi

alias pydoc="python -m pydoc"

# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands.  Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
    hash -r 2>/dev/null
fi

Upvotes: 15

Views: 19029

Answers (4)

proteome
proteome

Reputation: 326

I ran into this problem using VS Code and the venv package from python's standard library, since I use bash for my default terminal.

Bash scripts should always use LF instead of CRLF line endings. This is now fixed for the python virtualenv package, but it's still an issue with venv.

As described here, https://bugs.python.org/issue43437, venv copies its activate script template in binary mode when creating new virtual environments. Therefore we only need to convert the original to Unix line endings, using any of Mark's methods above.

The activate script template is located here: <python3_root>/Lib/venv/scripts/common/activate

To fix it in place: sed -i 's/\r$//' activate

As long as that file keeps its LF line endings, new virtual environments created with venv should have viable activation scripts.

Upvotes: 5

Mark
Mark

Reputation: 1983

The issue is that the activate script has Windows line endings. We can confirm this by running the below command on the command line.

$ file activate

which returns

activate: ASCII text, with CRLF line terminators

CRLF line terminators means windows line endings.

Therefore we need to convert them to Unix line endings so that we can source the file.

We have a few of options

  1. dos2unix activate - (this edits the file in place)
  2. sed -i 's/\r$//' activate (also edits the file in place)
  3. mv activate activate_with_windows_line_endings && (tr -d '\r' < activate_with_windows_line_endings ) > activate here we we just remove any occurrence of \r and the original file is preserved.
  4. Open the file in your favourite text editor. Most will have a way to both show the current line endings of the file (bottom right of image below) and a way to convert them to Unix line endings (In Notepad++ we go to Edit → EOL Conversion → Unix (LF) and then save. Here is a screenshot of how to do it in Notepad++ enter image description here

Finally

Now source activate should work.

Upvotes: 26

Glassy
Glassy

Reputation: 39

Maybe you have an alias in your .bashrc file, that's why deactivate takes like the command, not like a function

instead

deactivate() {

use this

function deactivate() {

Upvotes: 2

Arya Voronova
Arya Voronova

Reputation: 527

Just had the same problem, and decided to do hexdump -C bin/activate to figure out. Turns out my bin/activate file had CR/LF line endings instead of just CR, changing them with (tr -d '\r' < bin/activate) > bin/activatefixed my problem.

Upvotes: 5

Related Questions