为何which mkvirtualenv返回值为1(False)却仍能成功执行?
问题:
which mkvirtualenv返回值为1,为何mkvirtualenv test还能成功运行? 我在终端依次执行了这些命令:
which mkvirtualenv echo "Return Value: $?" mkvirtualenv test deactivate
对应的输出如下:
Return Value: 1 Using base prefix '/usr' New python executable in /home/xxxxxx/.virtualenvs/test/bin/python3 Not overwriting existing python script /home/xxxxxx/.virtualenvs/test/bin/python (you must use /home/xxxxxx/.virtualenvs/test/bin/python3) Installing setuptools, pip, wheel...done. (test)$ $
为什么which mkvirtualenv返回值是1(表示未找到对应命令),但mkvirtualenv test却能正常创建虚拟环境呢?
解答
这事儿的核心原因在于:mkvirtualenv不是一个独立的可执行文件,而是virtualenvwrapper提供的shell函数,不属于系统里的外部命令范畴。
which命令的本职工作是查找外部可执行程序的路径,它只会在PATH环境变量指定的目录里搜索独立的二进制文件或脚本,对shell函数、别名这类shell内部定义的“命令”完全识别不出来,所以返回1(找不到目标)是正常的。- 而
mkvirtualenv作为shell函数,是直接在当前shell进程中运行的,不需要通过PATH来定位——只要你的shell已经加载了virtualenvwrapper的配置(通常是在~/.bashrc或~/.zshrc里执行了source virtualenvwrapper.sh),就能直接调用这个函数,自然能顺利创建虚拟环境。
你可以自己验证一下:在终端执行type mkvirtualenv,它会输出类似mkvirtualenv is a function的结果,这就直接坐实了它的身份~
内容的提问来源于stack exchange,提问作者puk
相关产品推荐
相关产品推荐

