首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印python stdout到stdout

打印python stdout到stdout
EN

Stack Overflow用户
提问于 2013-05-07 14:54:18
回答 2查看 2.7K关注 0票数 1

这是一个有点棘手的解释,所以我提前道歉。

我有一个用Python编写的命令行应用程序。它登录到stderr和stdout;日志过滤器配置如下:

代码语言:javascript
复制
class StdErrFilter(logging.Filter):
    def filter(self,record):
        return 1 if record.levelno >= 30 else 0

class StdOutFilter(logging.Filter):
    def filter(self,record):
        return 1 if record.levelno <= 20 and record.levelno > 10 else 0 

设置日志记录的函数如下所示:

代码语言:javascript
复制
def setup_logging(logger_name):
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.DEBUG)

    formatter = logging.Formatter(fmt=LOG_FMT)

    err_handler = logging.StreamHandler(sys.__stderr__)
    err_handler.addFilter(StdErrFilter())
    err_handler.setFormatter(formatter)
    logger.addHandler(err_handler)

    out_handler = logging.StreamHandler(sys.__stdout__)
    out_handler.addFilter(StdOutFilter())
    out_handler.setFormatter(formatter)
    logger.addHandler(out_handler)

    return logger

当应用程序被直接调用时,它会像我预期的那样工作,即info()和下面的print到stdout,warn()和上面的打印到stderr。然而,当在bash脚本中进行完全相同的调用时,信息和下面的信息不会打印到终端,但是stderr仍然可以正常工作。我可以使脚本管道成为文件,但不是终端。有什么好主意吗?

编辑--我也应该显示bash脚本。这里还有其他一些与构建Python应用程序的args相关的逻辑,但是实际调用在for循环中接近底部。注意,Python应用程序是一个可执行模块。

代码语言:javascript
复制
#!/bin/bash

# provide one argument, the directory to search for ".xml" files.
dir_to_index=$1

FIND=/usr/bin/find
PYTHON=/usr/bin/python

SOLR="http://localhost:8983/solr/pul-development" 

BIN="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

marc_to_solr=$BIN/../marc_to_solr
PYTHONPATH=$marc_to_solr:$PYTHONPATH

db_config=$BIN/../etc/database.ini
config=db_config=$BIN/../etc/config.ini

for f in `$FIND $dir_to_index -name "*.xml"`; do
    echo "File: $f"
    cmd="$PYTHON -m marc_to_solr -d $db_config -s $SOLR -c etc/config.ini -i $f"
    `$cmd`
done
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-07 16:19:36

问题就在眼前

代码语言:javascript
复制
`$cmd`

bash中的Backticks意味着将stdout重定向到内部bash缓冲区,您可以将该缓冲区包含在另一个命令中或分配给bash变量。只要省略后排,它就会做你想做的事。

票数 2
EN

Stack Overflow用户

发布于 2013-05-07 16:21:14

我认为问题在于对python脚本的调用。通过将$cmd放在滴答中,您将告诉bash以bash命令的形式运行程序的stdout输出。这是我能想到的最简单的情况

代码语言:javascript
复制
echo 'import sys
sys.stdout.write(str(1))
sys.stderr.write(str(2))' > test.py

cmd='python test.py'

现在我们可以尝试用几种不同的方式来调用它

代码语言:javascript
复制
# If you invoke it like this, it works fine
$cmd
# And this will work, too
bash -c "$cmd"
# If you invoke it like this, you'll get some complaints
`$cmd`
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16422171

复制
相关文章

相似问题

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