停止virtualenvwapper和anaconda的冲突

Sco*_*d77 12 python virtualenv virtualenvwrapper anaconda

我正在使用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.
Run Code Online (Sandbox Code Playgroud)

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

有什么建议可以解决这场冲突吗?

bpi*_*pat 15

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

mv deactivate conda-deactivate

  • 这很脆弱,因为conda也在几个地方使用了停用. (3认同)

Tho*_*ote 10

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

deactivate我们可以简单地调用是否调用该函数来调用该文件,而不是简单地丢弃通过调用抛出的任何错误.如前所述,virtualenv和virtualenvwrapper创建了一个名为的函数deactivate;*condas调用同名的脚本文件.

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

type deactivate >/dev/null 2>&1
if [ $? -eq 0 ]
Run Code Online (Sandbox Code Playgroud)

更严格的测试是否是shell函数:

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

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

注意比较中的变量替换nametype.这是因为输出type -wzsh返回类似" name: type",而不是type -tbash它返回简单的" type".如果存在任何空格,则替换将删除最后一个空格字符的所有内容,仅保留类型值.这无害无益bash.

(感谢@toprak的zsh测试和正确的标志type -w,在zsh下.我期待更多的跨shell编码技巧!)

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


asm*_*rer 3

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

  • 右边的停用在哪里?我使用brew来安装我的virtualenvwrapper。/usr/local/bin/virtualenvwrapper.sh 中有很多“deactivate”。有什么优雅的解决方案来改变它使用的停用方式吗? (2认同)