Python virtualenv 无法在 Windows 10 Cmder 中激活

Python virtualenv 无法在 Windows 10 Cmder 中激活

我在 Windows 10 上使用 Cmder,在笔记本电脑和工作电脑上使用 Python 3.5 和 virtualenv,一切正常。

现在我有一台运行 Windows 10、Python 3.5、virtualenv 15.0 的新计算机,并且我能够使用以下命令初始化 Python 虚拟环境:

virtualenv env

我得到了 virtualenv 目录,但是当我运行时:

env/Scripts/activate

什么都没发生。没有错误消息,最糟糕的是没有任何信息表明环境是否已激活(即字符串“(env)”不会在路径旁边的终端中弹出)。

奇怪的是,当我使用普通的 cmd 时,我可以激活 venv,并且“(env)”会显示在终端中。但在 Cmder 中运行时却不行。另一个奇怪的事情(我不认为相关,但可能相关)是,一旦我可以在常规 cmd 中运行虚拟环境,当我尝试关闭它时,它会说“deactivate”关键字无法识别。

我在 StackOverflow 上找到了这篇文章(如下),它很类似但并不是那么有用,因为它实际上并没有答案而且更多的是关于 PowerShell。

https://stackoverflow.com/questions/31769863/cant-activate-python-venv-in-windows-10

有什么想法吗?

谢谢。

答案1

笔记这个答案已经过时了,不再需要作为 cmder现在支持 conda/venv. 如果 cmder 安装不适合您,请更新它。

原始(过时)答案

我在 conda env 中遇到了类似的问题(对于 vanilla virtualenv 似乎也存在同样的问题)。Cmder 强制使用自己的提示并忽略 PROMPT 环境变量,您需要添加一个名为 [cmder dir]\config[something].lua 的文件,内容如下:

 -- Code based on https://github.com/cmderdev/cmder/issues/1056
 -- with modifications to make it actually work (https://github.com/cmderdev/cmder/issues/1056#issuecomment-237403714)
---
 -- Find out current conda/virtual envs
 -- @return {false|conda/virtual env name}
---

local clink_path_lua_file = clink.get_env('CMDER_ROOT')..'\\vendor\\clink-completions\\modules\\path.lua'
dofile(clink_path_lua_file)

function get_virtual_env(env_var)
    env_path = clink.get_env(env_var)
    if env_path then
        basen = exports.basename(env_path)
        return basen
    end
    return false
end

---
 -- add conda env name 
---
function conda_prompt_filter()
    -- add in conda env name
    local conda_env = get_virtual_env('CONDA_DEFAULT_ENV')
    if conda_env then
        clink.prompt.value = string.gsub(clink.prompt.value, "λ", "["..conda_env.."] λ")
    end
end

---
 -- add virtual env name 
---
function venv_prompt_filter()
    -- add in virtual env name
    local venv = get_virtual_env('VIRTUAL_ENV')
    if venv then
        clink.prompt.value = string.gsub(clink.prompt.value, "λ", "["..venv.."] λ")
    end
end

clink.prompt.register_filter(conda_prompt_filter, 20)
clink.prompt.register_filter(venv_prompt_filter, 20)

相关内容