【问题标题】:Can an existing folder be re-declared a virtual environment?可以将现有文件夹重新声明为虚拟环境吗?
【发布时间】:2014-03-13 11:46:34
【问题描述】:
不确定我问这个问题的方式是否正确,但基本上我希望“重新声明”或“恢复”在 VirtualEnvWrapper 中创建的虚拟环境。
我最初创建了虚拟环境,当我发出workon 命令时我能够看到它。但是,由于我正在使用文件结构(我想将所有 Python 文件移动到一个名为 Python 的文件夹中,并将我的 Bootstrap 文件移动到一个名为 Static 的文件夹中),因此使用命令 workon
不再显示环境
我曾想过将 bin 文件夹等移回顶层会修复它,但似乎并非如此。
【问题讨论】:
标签:
virtualenv
virtualenvwrapper
【解决方案1】:
是的。
virtualenvwrapper 剖析
现有项目有两部分:
- 安装了 python 和 python 库的 virtualenv,以及
- 代码所在的项目目录(使用 virtualenv)。
Virtualenvwrapper 添加了第三部分,virtualenvwrapper 钩子。这些主要是在项目或 virtualenvs 生命周期中的特定时间调用的 shell 函数。它们位于第三个目录中——默认情况下,它们安装到 ~/.virtualenvs(至少在我的 Debian 系统上是这样)。这些钩子包括我们将在下面编辑的 postactivate,以及一些其他的,例如 premkproject、premkvirtualenv 等。以下关键字列表为您提供了钩子的风格:initialize、pre/post、mk/rm、project/virtualenv , 激活/停用。
virtualenvwrapper 将这些脚本放在 $VIRTUALENVWRAPPER_HOOK_DIR 中,默认为 $WORKON_HOME。
virtualenvwrapper 假设
- 所有 virtualenvs 都在一个地方 ($WORKON_HOME) (默认为 ~/.virtualenvs)
假设您有两个虚拟环境,一个称为 MYVENV,另一个称为 MYOTHERVENV
- 所有项目目录都在另一个地方($PROJECT_HOME)。
假设您在目录 /home/me/where/my/proj 中有一个使用 virtualenv MYVENV 的项目“is”。
如何使用 workon 处理预先存在的代码和 virtualenv
这里我假设你所有的 virtualenvs 都在一个地方(在我的例子中,它们都在 /usr/local/virtualenv 中)。
一次性操作
编辑 ~/.virtualenvs/postactivate 以拥有
case $env_name in
MYVENV)
cd /home/me/where/my/proj/is
;;
MYOTHERVENV)
cd /home/me/where/my/other/project/is2
;;
esac
链接
for hk in get_env_details initialize postactivate postdeactivate \
postmkproject postmkvirtualenv postrmproject postrmvirtualenv \
preactivate predeactivate premkproject premkvirtualenv \
prermproject prermvirtualenv; do \
ln -s ~/.virtualenvs/$hk /usr/local/pythonenv/$hk; \
done
任何时候您想处理使用 MYVENV virtualenv 的项目
WORKON_HOME=/usr/local/pythonenv workon MYVENV
当然,如果你所有的 virtualenvs 确实在同一个地方,你可以在你的 .profile 中定义 WORKON_HOME 并且你不必每次都在命令行中指定它。