解决powershell激活conda环境时的报错

Invoke-Expression : 无法将参数绑定到参数“Command”,因为该参数为空字符串。

如果不想看分析, 可以直接跳到解决部分.


问题的发现

在cursor中新建终端时,会发现这样的报错:

虽然报错不影响使用,但足够难受。

问题分析

红色部分是powershell的报错,我们根据报错定位到这个ps文件

可以看到,报错指的就是这个$activateCommand变量为空.
这个变量是一个命令执行的结果:

$activateCommand = (& $Env:CONDA_EXE $Env:_CE_M $Env:_CE_CONDA shell.powershell activate $Name | Out-String);

我先输出这个命令看看执行了什么, 添加一行:

Write-Host "$Env:CONDA_EXE $Env:_CE_M $Env:_CE_CONDA shell.powershell activate $Name";

输出:

C:\application\program\anaconda\Scripts\conda.exe   shell.powershell activate base

为什么这个命令输出会是空呢? 我们在终端中运行试试:
中间的path部分我就打码了, 可以看到命令是正常的

但是cursor里面新建终端仍然有报错

我们查看cursor里面的完整报错, 在一开始的部分有python的报错:

这里显示, 在这个py文件中代码出错, gbk的编码方式不对
我们查看代码

def main_sourced(shell, *args, **kwargs):
    """Entrypoint for the "sourced" invocation of CLI interface. E.g. `conda activate`."""
    shell = shell.replace("shell.", "", 1)

    # This is called any way later in conda.activate, so no point in removing it
    from ..base.context import context

    context.__init__()

    from ..activate import _build_activator_cls

    try:
        activator_cls = _build_activator_cls(shell)
    except KeyError:
        from ..exceptions import CondaError

        raise CondaError(f"{shell} is not a supported shell.")

    activator = activator_cls(args)
    print(activator.execute(), end="")
    return 0

解决方案

从直觉来看, 似乎只要换个编码就行. python里面字符串是以unicode存储的, 所以gbk出错应该是在print时.
所以我们修改python的输出流编码就行: 在报错的python文件的顶端加入:

import sys
import io
import os

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-16')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-16')

这样与windows的默认编码一致

从cursor的报错中可以看出, cursor的终端环境是嵌套的conda, 因此我们要清除终端, 关闭重启cursor后再进行测试

运行正常了

解决后检查

尝试输出一下环境变量, 这里就看看path:

Write-Host $Env:path 

检查发现是正确的

在vscode中新建终端, 也没有出错.

在自己的终端中没有报错, 手动输出环境变量也没有问题

尝试输入:

conda.exe shell.powershell activate base

发现有不正常的字符串:

可能是powershell显示的编码不同, 但是上面Write-Host是正常的, 所以这里只是显示问题了. 没有影响. 如果更改输出编码, 修复这里的显示问题, 那么conda激活的环节又可能出错了, 只能说鱼和熊掌不可兼得. 只要能正确激活环境就行.

至此, 问题解决. 要注意的是, conda更新版本之后, 需要检查一下这处修复是否需要重新弄.


杂谈

以下是杂谈, 问题的解决方案在上面.

我在搜索解决方案的时候, 总是搜到低质量的回答:

中文互联网特有的投屎.

还有一些五花八门的回答, 有说什么路径问题的(这个还好), 还有说什么直接把这段代码删掉的, 太匪夷所思了. 每个人的情况都可能不同, 但是最起码你所提供的方案要和你面临的报错相符吧? 我这个报错显示gbk编码错误, 那我就不会提供无关的方案.

如有其他问题可在下面评论.

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇