我使用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中有一个同名的脚本,因此它会被错误地调用。
有任何解决这场冲突的建议吗?
答案 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 -w
下zsh
的输出会返回类似" 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维护者进行此更改)