问题是关于 shell 设置虚拟环境包装器,扩展至虚拟环境(Python 指南)。
类似的问题已经被问过很多次,但答案却大不相同:
哪一个是“最好的”触发环境设置和功能定义脚本的方式,考虑几种可能的选项:
- 〜/ .profile
- ~./.bash_profile,〜/ .zprofile
- ~./bash_login,~./zlogin(深奥的选项)
- ~/.bashrc,~/.zshrc
“在 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
但这也不起作用:
- X(gnome-shell)未初始化,因此 .desktop 文件使用“系统”环境而不是虚拟环境执行命令。
- 某些进程(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 内容),请参阅:
可能需要“重新散列”......