Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 停用VirtualVwapper和anaconda中的冲突_Python_Virtualenv_Anaconda_Virtualenvwrapper - Fatal编程技术网

Python 停用VirtualVwapper和anaconda中的冲突

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'

我正在使用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' from PATH.
在谷歌上进行了一些搜索之后,似乎在/usr/local/bin/virtualenvwrapper.sh中定义的
workon
调用了
停用
。在Anaconda的箱子里有一个同名的脚本,所以它被workon错误地调用了


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

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

一个对我有效的解决方案是在水蟒的垃圾箱中重命名
停用


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

Anacondas是一个python发行版,它支持通过
conda env
处理虚拟环境,而virtualenvwrapper则专注于处理不同的虚拟环境。仅仅重命名anaconda/bin/activate脚本是一个脆弱的解决方案,可能会破坏
conda

virtualenvwrapper.sh
(函数
workon
)的代码执行
deactivate
,这恰好使用了anaconda脚本。此脚本返回一个错误。然后,
workon
代码继续并删除
deactivate
名称和它自己的
deactivate
来源,并动态创建
deactivate
功能

总之,它做了正确的事情,“错误”更像是一种警告。如果您想让它消失,您可以修改workon功能(搜索行
#以“破坏性”方式停用任何当前环境


(我建议对VirtualNVRapper维护人员进行此更改)

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

与其简单地丢弃调用
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