Ale*_*ail 15 zsh virtualenv virtualenvwrapper oh-my-zsh
我有很多项目~/Documents.我几乎只在python中工作,所以这些基本上都是python项目.每一个,例如~/Documents/foo都有自己的virtualenv,~/Documents/foo/venv(它们总是被称为venv).每当我在项目之间切换时,每天约10次,我这样做
deactivate
cd ..
cd foo
source venv/bin/activate
Run Code Online (Sandbox Code Playgroud)
我已经到达了我生病了打字的点deactivate和source venv/bin/activate.我正在寻找一种方法,cd ../foo并为我处理virtualenv操作.
我熟悉VirtualEnvWrapper,在我看来这有点笨拙.它似乎将你所有的virtualenvs移动到其他地方,并且据我所知,增加了一些复杂程度.(欢迎反对意见!)
我对shell脚本不太熟悉.如果你可以推荐一个低维护的脚本添加到我~/.zshrc完成这个,这将是绰绰有余,但从一些快速的谷歌搜索,我还没有找到这样的脚本.
我是zsh/ oh-my-zsh用户.oh-my-zsh似乎没有这个插件.这个问题的最佳答案是有人提供oh-my-zsh插件来做到这一点.(如果这里的答案黯淡无光,我可能会这样做.
Rom*_*man 14
到目前为止,最简单的选择(2019 年以上)就是添加virtualenvwrapper到您的~/.zshrc plugins
例如:
plugins=(
git pip python brew virtualenvwrapper
)
Run Code Online (Sandbox Code Playgroud)
MS_*_*MS_ 11
在.bashrc或.zshrc中添加以下内容
function cd() {
builtin cd "$@"
if [[ -z "$VIRTUAL_ENV" ]] ; then
## If env folder is found then activate the vitualenv
if [[ -d ./.env ]] ; then
source ./.env/bin/activate
fi
else
## check the current folder belong to earlier VIRTUAL_ENV folder
# if yes then do nothing
# else deactivate
parentdir="$(dirname "$VIRTUAL_ENV")"
if [[ "$PWD"/ != "$parentdir"/* ]] ; then
deactivate
fi
fi
}
Run Code Online (Sandbox Code Playgroud)
即使有人进入子文件夹,此代码也不会停用virtualenv.灵感来自@agnul和@Gilles的答案.
此外,为了增加安全性,请考虑direnv.
小智 10
对于任何使用(或考虑使用)pyenv 的人来说,这可以使用pyenv-virtualenv插件非常方便地实现,如此处所述。
基本上,您只需将一个.python-version文件添加到指定 virtualenv 名称的目录即可。
这是仅 zsh 的解决方案。
\n这是对daveruinseverything's 答案的改进,这是对MS_'s 答案的改进。
\n我们使用precmdhook 而不是覆盖cd。
我们添加了另一个额外功能。假设目录结构是
\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .venv\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 activate\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 subdir\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 subdir1\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 subdir2\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test2.txt\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test1.txt\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.txt\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 testing.py\nRun Code Online (Sandbox Code Playgroud)\n如果您现在在 subdir2 中打开一个新终端,或者直接cd从其他地方打开 subdir2,它将激活 venv。
解决办法是:
\nautoload -Uz add-zsh-hook\nadd-zsh-hook precmd automatically_activate_python_venv\n\nfunction automatically_activate_python_venv() {\n if [[ -z $VIRTUAL_ENV ]] ; then\n activate_venv\n else\n parentdir="$(dirname ${VIRTUAL_ENV})"\n if [[ "$PWD"/ != "$parentdir"/* ]] ; then\n deactivate\n activate_venv\n fi\n fi\n}\n\nfunction activate_venv() { \n local d n\n d=$PWD\n \n until false \n do \n if [[ -f $d/.venv/bin/activate ]] ; then \n source $d/.venv/bin/activate\n break\n fi\n d=${d%/*}\n # d="$(dirname "$d")"\n [[ $d = *\\/* ]] || break\n done\n}\nRun Code Online (Sandbox Code Playgroud)\n
如果不是direnv ,你应该尝试像autoenv这样的东西。
第一个被认为是“轻量级”,而第二个被认为是“简单,更高质量的软件”,分别听每个人的作者,谈论另一个人的项目。因此,在我看来,它们是相当不错的选择,可以同时尝试!
无论如何,两者都已在zsh外壳上进行了测试。尤其autoenv是使用起来真的很简单,安装后:
$ git clone git://github.com/inishchith/autoenv.git ~/.autoenv
$ echo 'source ~/.autoenv/activate.sh' >> ~/.bashrc
Run Code Online (Sandbox Code Playgroud)
只需“跟随白兔”并尝试例如
$ mkdir project
$ echo "echo 'whoa'" > project/.env
$ cd project
whoa
Run Code Online (Sandbox Code Playgroud)
“如果一个目录包含一个.env文件,它会在你cd进入它时自动执行。启用时(设置AUTOENV_ENABLE_LEAVE为非空字符串),如果一个目录包含一个.env.leave文件,它会在你离开时自动执行。”
请查看https://github.com/inishchith/autoenv以获取更详细的说明!...
把这样的东西放在你的.zshrc中
function cd() {
if [[ -d ./venv ]] ; then
deactivate
fi
builtin cd $1
if [[ -d ./venv ]] ; then
. ./venv/bin/activate
fi
}
Run Code Online (Sandbox Code Playgroud)
编辑:如评论中所述 - cd进入当前虚拟环境的子文件夹将停用它.一个想法可能是停用当前的env,只要 - 如果cd进入一个新的,如
function cd() {
builtin cd $1
if [[ -n "$VIRTUAL_ENV" && -d ./venv ]] ; then
deactivate
. ./venv/bin/activate
fi
}
Run Code Online (Sandbox Code Playgroud)
仍然可以改进,可能把它变成一个"提示命令"或尝试在文件夹名称上进行一些前缀匹配,以检查路径上的某个虚拟环境,但我的shell-fu还不够好.
您可以使用direnv而不是编写自定义脚本。它不是特定于zsh的解决方案(为此,您可以尝试zsh-autoenv),但是它维护良好且易于与zsh一起使用。安装完毕后,您想放在eval "$(direnv hook zsh)"的末尾.zshrc。此时,您可以执行以下操作:
$ source ~/.zshrc
$ cd foo
$ echo "layout python" > .envrc
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
$ direnv allow
direnv: loading .envrc
direnv: export +VIRTUAL_ENV ~PATH
Run Code Online (Sandbox Code Playgroud)
现在,您应该在virtualenv中。您可以运行pip freeze以进行测试,以查看是否已安装了特定于virtualenv的软件包。停用
$ cd ..
direnv: unloading
Run Code Online (Sandbox Code Playgroud)
对于后代:我使用了 @MS_ 的解决方案,但遇到了一个问题,即cd直接从一个项目到另一个项目会停用旧的 virtualenv,但不会激活新的 virtualenv。这是该解决方案的稍微修改版本,可解决此问题:
# auto activate virtualenv
# Modified solution based on https://stackoverflow.com/questions/45216663/how-to-automatically-activate-virtualenvs-when-cding-into-a-directory/56309561#56309561
function cd() {
builtin cd "$@"
## Default path to virtualenv in your projects
DEFAULT_ENV_PATH="./env"
## If env folder is found then activate the vitualenv
function activate_venv() {
if [[ -f "${DEFAULT_ENV_PATH}/bin/activate" ]] ; then
source "${DEFAULT_ENV_PATH}/bin/activate"
echo "Activating ${VIRTUAL_ENV}"
fi
}
if [[ -z "$VIRTUAL_ENV" ]] ; then
activate_venv
else
## check the current folder belong to earlier VIRTUAL_ENV folder
# if yes then do nothing
# else deactivate then run a new env folder check
parentdir="$(dirname ${VIRTUAL_ENV})"
if [[ "$PWD"/ != "$parentdir"/* ]] ; then
echo "Deactivating ${VIRTUAL_ENV}"
deactivate
activate_venv
fi
fi
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5733 次 |
| 最近记录: |