首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何抑制来自Python调用的所有Fish错误输出?

如何抑制来自Python调用的所有Fish错误输出?
EN

Stack Overflow用户
提问于 2020-08-25 20:02:19
回答 1查看 58关注 0票数 1

我想使用Fish shell遍历Python虚拟环境,并打印一个包含两列的表,在括号中显示(1)虚拟环境名称和(2)该环境的Python版本:

代码语言:javascript
复制
ansible                (3.7.7)
cookiecutter           (3.7.8)
pelican                (3.7.8)
tempenv-0f20326801926  (broken)
tempenv-1b0a326016370  (3.8.5)
wagtail                (broken)

对于给定的环境,运行python --version通常会生成其版本号。但是,如果符号链接的Python解释器不再存在,则会返回如下错误:

代码语言:javascript
复制
dyld: Library not loaded: @executable_path/../.Python
Referenced from: /Virtualenvs/tempenv-0f20326801926/bin/python
Reason: image not found
fish: '/Virtualenvs/tempenv-0…' terminated by signal SIGABRT (Abort)

在后一种情况下,虚拟环境被破坏,因此我希望将Python版本号设置为broken,同时抑制所有错误输出,以便用户只看到打印的表,而看不到错误。

我已经能够通过下面的代码段取消上述错误输出的前三行-但不是第四行:

代码语言:javascript
复制
begin; pushd $VIRTUALENV_HOME; and set -e dirprev[-1]; end
for i in */bin/python
    set -l python_version
    if test -x "$VIRTUALENV_HOME/$i"
        set -l test_python ("$VIRTUALENV_HOME/$i" -V >/dev/null 2>/dev/null)
        if test $status -eq 0
            set python_version ("$VIRTUALENV_HOME/$i" -V | string split " ")[2]
        else
            set python_version broken
        end
    else
        set python_version broken
    end
    printf "%-33s (%s)\n" $i $python_version
end | sed "s|/bin/python||"
begin; popd; and set -e dirprev[-1]; end

但是,尽管我可能会尝试,我还是想不出如何抑制fish: '[…]' terminated by signal SIGABRT (Abort)行:

代码语言:javascript
复制
ansible                (3.7.7)
cookiecutter           (3.7.8)
pelican                (3.7.8)
fish: Job 4, '"$VIRTUALFISH_HOME/$i" -V >/dev…' terminated by signal SIGABRT (Abort)
tempenv-0f20326801926  (broken)
tempenv-1b0a326016370  (3.8.5)
fish: Job 4, '"$VIRTUALFISH_HOME/$i" -V >/dev…' terminated by signal SIGABRT (Abort)
wagtail                (broken)

如何改进上面的一节,并从打印表中消除无用的错误消息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-26 02:44:20

需要注意的是,您无法抑制的错误来自正在执行脚本的shell。它不是由失败的python命令编写的。解决方案是使用另一个shell级别,以便您可以抑制来自该shell作业控制错误消息,同时仍然捕获您感兴趣的命令的stdout:

代码语言:javascript
复制
set -l test_python (fish -c "'$VIRTUALENV_HOME/$i' -V" 2>/dev/null)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63578440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档