Reputation: 591
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
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
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
dos2unix activate
- (this edits the file in place)sed -i 's/\r$//' activate
(also edits the file in place)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.Edit → EOL Conversion → Unix (LF)
and then save. Here is a screenshot of how to do it in Notepad++
Now source activate
should work.
Upvotes: 26
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
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/activate
fixed my problem.
Upvotes: 5