Python 停用VirtualVwapper和anaconda中的冲突
我正在使用virtualenv切换python开发环境。但是,当我在我的_env上运行Python 停用VirtualVwapper和anaconda中的冲突,python,virtualenv,anaconda,virtualenvwrapper,Python,Virtualenv,Anaconda,Virtualenvwrapper,我正在使用virtualenv切换python开发环境。但是,当我在我的_env上运行工作时,我会遇到这样的错误消息: Error: deactivate must be sourced. Run 'source deactivate' instead of 'deactivate'. Usage: source deactivate removes the 'bin' directory of the environment activated with 'source activate'
工作时,我会遇到这样的错误消息:
Error: deactivate must be sourced. Run 'source deactivate'
instead of 'deactivate'.
Usage: source deactivate
removes the 'bin' directory of the environment activated with 'source
activate' from PATH.
在谷歌上进行了一些搜索之后,似乎在/usr/local/bin/virtualenvwrapper.sh中定义的workon
调用了停用。在Anaconda的箱子里有一个同名的脚本,所以它被workon错误地调用了
有任何解决此冲突的建议吗?您可以编辑/usr/local/bin/virtualenvwrapper.sh,使停用
指向它应该引用的任何停用
的绝对路径 一个对我有效的解决方案是在水蟒的垃圾箱中重命名停用
:
mv-deactivate-conda-deactivate
在anaconda中,activate
是一个可执行脚本,位于anacondabin
目录中,但它是virtualenvwrapper.sh
中的一个函数。这是一种名称空间冲突问题,但也是功能重叠的情况
Anacondas是一个python发行版,它支持通过conda env
处理虚拟环境,而virtualenvwrapper则专注于处理不同的虚拟环境。仅仅重命名anaconda/bin/activate脚本是一个脆弱的解决方案,可能会破坏conda
virtualenvwrapper.sh
(函数workon
)的代码执行deactivate
,这恰好使用了anaconda脚本。此脚本返回一个错误。然后,workon
代码继续并删除deactivate
名称和它自己的deactivate
来源,并动态创建deactivate
功能
总之,它做了正确的事情,“错误”更像是一种警告。如果您想让它消失,您可以修改workon功能(搜索行#以“破坏性”方式停用任何当前环境)
(我建议对VirtualNVRapper维护人员进行此更改)我同意@FredrikHedman的评论,即重命名anaconda/minicondabin
目录中的脚本可能很脆弱。他的完整帖子让我找到了一个更有力的答案。(谢谢!)
与其简单地丢弃调用deactivate
抛出的任何错误,我们可以简单地根据是否调用函数而不是文件来条件调用。如前所述,virtualenv和virtualenvwrapper创建了一个名为deactivate
的函数;*condas调用同名的脚本文件
因此,在virtualenvwrapper.sh
脚本中,我们可以更改以下两行,这两行测试deactivate
是否仅可调用:
type deactivate >/dev/null 2>&1
if [ $? -eq 0 ]
对是否为外壳函数进行了更严格的测试:
if [ -n $ZSH_VERSION ] ; then
nametype="$(type -w deactivate)"
else
nametype="$(type -t deactivate)"
fi
if [ "${nametype##* }" == "function" ]
此更改避免触发原始问题中指出的伪错误,但不会将其他有用的错误或输出重定向到静默遗忘中
注意比较中nametype
上的变量替换。这是因为zsh
下的type-w
的输出返回类似于“name:type
”的内容,而bash下的type-t
只返回“type
”的内容。替换将删除直到最后一个空格字符的所有内容(如果存在空格),只保留类型值。这在bash
中不会造成任何危害
(感谢@toprak的zsh
测试和zsh下的正确标志type-w
。我期待更多跨shell编码技巧!)
一如既往,我感谢建设性的反馈和评论 因为我没有足够的声誉来添加评论:
Thomas Capote的建议很好(thx 4),除了“zsh”没有内置命令的“-t”选项“type”。因此,有必要添加另一条条件语句,以获得“nametype”所需的结果:
希望它能帮助其他zsh用户。正确的方法在哪里?我使用brew安装了我的VirtualVWrapper。在/usr/local/bin/virtualenvwrapper.sh中有很多“停用”的。有没有优雅的解决方案可以改变deactivate的用法?VirtualEnvRapper希望deactivate是一个shell函数,没有指向的路径。在看到这个答案之前,我选择了相同的名称+1对于conda,停用作为新标准!这是脆弱的,因为康达也使用停用在几个地方。它的工作,这个解决方案有我的投票我同意康达可以使用停用在另一种方式改变其名称听起来不是一个好主意,让康达一个人<代码>类型-t
在zsh(5.1.1)中不起作用。更新python-mpip安装-U virtualenvwrapper
为我修复了与pyenv的deactivate的冲突。取而代之的是错误-bash:type:-w:invalid option
,因此我必须返回到版本之前的版本,即我没有else
,而不是nametype=“$(type-w deactivate)”
我有nametype=“$(type-t deactivate)”
非常感谢@toprak为zsh添加的有用信息!我将编辑我的答案,以纳入这一点,并信贷你。
if [ -n $ZSH_VERSION ] ; then
nametype="$(type -w deactivate)"
else
nametype="$(type -t deactivate)"
fi
if [ "${nametype##* }" == "function" ]
# Anaconda workaround for "source deactivate" message:
# Start of workaround:
#type deactivate >/dev/null 2>&1
#if [ $? -eq 0 ]
if [ -n $ZSH_VERSION ] ; then
nametype="$(type -w deactivate)"
else
nametype="$(type -t deactivate)"
fi
if [ "${nametype##* }" == "function" ]
# End of workaround