virtualenv/virtualenvwrapper 的 shell 环境设置

virtualenv/virtualenvwrapper 的 shell 环境设置

问题是关于 shell 设置虚拟环境包装器,扩展至虚拟环境Python 指南)。

类似的问题已经被问过很多次,但答案却大不相同:

哪一个是“最好的”触发环境设置和功能定义脚本的方式,考虑几种可能的选项:

  1. 〜/ .profile
  2. ~./.bash_profile〜/ .zprofile
  3. ~./bash_login~./zlogin(深奥的选项)
  4. ~/.bashrc~/.zshrc

virtualenvwrapper 指南状态:

“在 shell 启动文件 (.bashrc、.profile 等) 中添加三行来设置虚拟环境所在的位置”

在考虑可用选项之前,重要的是考虑可能的“用例”

  • 终端(控制台)登录(无需 X,本地)
  • ssh 远程登录(交互式)
  • ssh 远程命令执行(非交互式)
  • 通过“图形”登录(GDM)后,打开终端(gnome-terminal)
  • 直接在 DE (Gnome) 中,通过“桌面”文件执行调用
  • 从 xclient 间接调用(例如 emacs 子进程)
  • 作为用户的 cron 任务
  • 为非 root 用户注册为 systemd 服务(或套接字)
  • 由服务子进程间接启动(例如 httpd CGI)

为了支持 X 图形登录,设置路径的唯一方法是通过〜/ .profile,通过获取来源/etc/gdm/Xsession, 后/etc/配置文件

虽然这是路径和环境设置的最佳位置,但它无法正确定义 virtualenvwrapper 函数(“从事于”

原因是 Xsession 是在 POSIX 下执行的/bin/shshell,不受 virtualenvwrapper 的支持(bash、zsh、ksh 支持)

一些发行版采用了短跑作为 POSIX shell,而其他仍然依赖于 POSIX 模式的 bash 调用。

用于非 bash/zsh/ksh 排除。


在 X 登录中,使用〜/ .profile对于(手动)环境设置有效:

export WORKON_HOME=~/.virtualenvs
export ENV_NAME='myvirtualenv'
export VIRTUAL_ENV="$WORKON_HOME/$ENV_NAME"
export PATH="$VIRTUAL_ENV/bin:$PATH"
unset PYTHON_HOME

virtualenvwrapper 函数定义不起作用;

source `which virtualenvwrapper.sh`

另一种选择是把所有东西都放进去~/.bashrc

export WORKON_HOME=~/.virtualenvs
export ENV_NAME='myvirtualenv'
source `which virtualenvwrapper.sh`

workon $ENV_NAME

但这也不起作用:

  1. X(gnome-shell)未初始化,因此 .desktop 文件使用“系统”环境而不是虚拟环境执行命令。
  2. 某些进程(emacs)设置的环境被 ~/.bashrc 覆盖破坏

一个例子:


更好的选择可能是混合解决方案(不太酷......)

〜/ .profile、手动环境设置

export WORKON_HOME=~/.virtualenvs
export ENV_NAME='myvirtualenv'
export VIRTUAL_ENV="$WORKON_HOME/$ENV_NAME"
export PATH="$VIRTUAL_ENV/bin:$PATH"
unset PYTHON_HOME

的〜/ .bash_profile或者〜/ .zprofile,包含POSIX配置文件和函数定义:

[ -f ~/.profile ] && source ~/.profile
[ -f `which virtualenvwrapper.sh` ] && source `which virtualenvwrapper.sh`

在 gnome-terminal 中,启用“登录 shell”选项,“从事于”函数得到定义。

对于远程执行,可以通过以下方式触发配置文件包含:

ssh localhost bash --login -c env

也许可以做类似的事情systemd计划任务调用。

看:


所有这些配置看起来都很丑陋,而且难以维护。有没有更好的解决方案?

答案1

但是,为什么虚拟环境应该在全球范围活跃呢?gnome 外壳语境 ?

这肯定会打破一切系统级已安装python应用程序。

所以仅有的启动虚拟环境应用程序的安全方法是从终端 shell 启动

也许更安全的做法是启用环境中的〜/ .bash_profile 〜/ .zprofile,使登录外壳终端中的选项。

替代设置,使用~/.bashrc,应避免使用,因为它可能导致子 shell 出现问题。

所以,

  • 启用登录选项
  • 启动终端(或 xterm 中的 bash/zsh --login ...)
  • “从事于”
  • 然后从终端 shell 启动 emacs(服务器)。

从以下位置运行 virtualenv 应用程序gnome 外壳,桌面文件必须执行源环境的专用包装器脚本启用执行之前。

对于通用包装器(类似于 ruby‘捆绑执行’和 rvm 内容),请参阅:

可能需要“重新散列”......

相关内容