在你的shell中,通常
python
会指向默认的Python实例:最初的回答
python
Python 2.7.14 (default, Sep 25 2017, 09:53:22)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
这是因为
python
位于默认
PATH
的一部分
/usr/local/bin
。现在,当你
source activate <some_env>
时,你正在
修改PATH
,你可以在
/path/to/venv/some_env/bin/activate
文件中看到这一点。"Original Answer"翻译成"最初的回答"。
#!/bin/bash
...
if [[ $PATH == *"CONDA_PATH_PLACEHOLDER"* ]]; then
export PATH="$($_CONDA_PYTHON -c "import re; print(re.sub(r'CONDA_PATH_PLACEHOLDER', r'$_NEW_PART', '$PATH', 1))")"
else
export PATH="$_NEW_PART:$PATH"
fi
if [[ "$@" == */* ]]; then
export CONDA_DEFAULT_ENV=$(get_abs_filename "$args")
else
export CONDA_DEFAULT_ENV="$args"
fi
...
esac
我正在使用Anaconda,但概念是相同的,
...
表示我已经删掉了脚本的某些部分。它有效地将venv
python
可执行文件路径导出到
PATH
中。因此,除非满足以下两个条件之一,否则不会指向
venv
python:a)您明确调用该python可执行文件或b)您
source activate myenv
然后再调用
python
。
因此,正确的工作流程是:
source /path/to/myenv/bin/activate myenv
然后调用python
例如,第一个对$PATH
的调用是在激活我的conda env之前,第二个是在激活之后:
➜ ~ echo $PATH
/Users/mm92400/bin:/usr/local/bin:/Users/mm92400/anaconda3/bin:/Users/mm92400/.cargo/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Frameworks/Mono.framework/Versions/Current/Commands
➜ ~ source activate py36
(py36) ➜ ~ echo $PATH
/Users/mm92400/anaconda3/envs/py36/bin:/Users/mm92400/bin:/usr/local/bin:/Users/mm92400/anaconda3/bin:/Users/mm92400/.cargo/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Frameworks/Mono.framework/Versions/Current/Commands
note how $PATH
is different
source /path/to/activate
,而不是在交互式的python
解释器中执行:)。source
是一个shell(bash、ksh等)内置函数:),而不是与python
相关的东西。 - han solo激活
一个虚拟环境时,你正在改变shell运行的python可执行文件。因此,你不能在python正在运行时激活虚拟环境,因为你已经选择了一个特定的解释器。 - C.Nivs