停用virtualenvwapper和anaconda

时间:2015-05-18 16:16:05

标签: python virtualenv anaconda virtualenvwrapper

我使用virtualenv来切换我的python dev env。但是当我运行workon my_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' from PATH.

在谷歌上进行一些搜索后,似乎workon(在/usr/local/bin/virtualenvwrapper.sh中定义)会调用deactivate。并且在Anaconda的bin中有一个同名的脚本,因此它会被错误地调用。

有任何解决这场冲突的建议吗?

5 个答案:

答案 0 :(得分:15)

对我有用的一个解决方案是在Anaconda的bin中重命名deactivate

mv deactivate conda-deactivate

答案 1 :(得分:10)

我同意@FredrikHedman的评论,即在anaconda / miniconda bin目录中重命名脚本有可能是脆弱的。他的完整帖子让我觉得我觉得这是一个更有力的答案。 (谢谢!)

我们可以简单地调用是否会调用函数而不是文件,而不是简单地抛弃调用deactivate引发的任何错误。如上所述,virtualenv和virtualenvwrapper创建了一个名为deactivate的函数; * condas调用同名的脚本文件。

因此,在virtualenvwrapper.sh脚本中,我们可以更改以下两行来测试deactivate是否仅可调用:

type deactivate >/dev/null 2>&1
if [ $? -eq 0 ]

更严格地测试它是否是一个shell函数:

if [ -n $ZSH_VERSION ] ; then
    nametype="$(type -w deactivate)"
else
    nametype="$(type -t deactivate)"
fi
if [ "${nametype##* }" == "function" ]

此更改可避免触发原始问题中提到的虚假错误,但不会冒着将其他有用错误或输出重定向到无声遗忘的风险。

注意比较中nametype的变量替换。这是因为type -wzsh的输出会返回类似" name: type"与type -t下的bash相反,type只返回" bash"。如果存在任何空格,则替换将删除最后一个空格字符的所有内容,仅保留类型值。这在zsh中无害。

(感谢@toprak进行type -w测试以及zsh下的正确标记npm install @ionic/cloud-angular --save。我期待更多跨shell编码提示!)

与往常一样,我感谢建设性的反馈和评论!

答案 2 :(得分:3)

您可以编辑/usr/local/bin/virtualenvwrapper.sh,使deactivate指向它应该引用的deactivate的绝对路径。

答案 3 :(得分:2)

由于我没有足够的声誉来添加评论: 托马斯·卡波特的建议很好(第4条),除了" zsh"没有" -t"选项内置命令"输入" 。因此,必须添加另一个条件语句以获得" nametype":

的所需结果
# 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

希望它可以帮助其他zsh用户。

答案 4 :(得分:1)

在anaconda activate中是一个位于anaconda bin目录中的可执行脚本,但它是virtualenvwrapper.sh中的一个函数。所以这是一种名称空间冲突问题,但也是功能重叠的情况。

Anacondas是一个python发行版 - 在许多其他方面 - 支持通过conda env处理虚拟环境,而virtualenvwrapper专注于处理不同的虚拟环境。只是重命名anaconda / bin / activate脚本是一个脆弱的解决方案,可能会中断conda

virtualenvwrapper.sh(函数workon)的代码执行恰好使用anaconda脚本的deactivate。此脚本返回错误。然后,workon代码会继续显示并删除deactivate名称并提供自己的deactivate,并动态创建deactivate函数。

总之,它做得对,“错误”可以更多地被视为警告。如果你想让它消失,你可以修改workon函数(搜索行# Deactivate any current environment "destructively"

deactivate
-->
deactivate >/dev/null 2>&1

(我已经建议对virtualenvwrapper维护者进行此更改)