让python脚本打印到终端而不作为stdout的一部分返回

时间:2014-04-16 19:16:43

标签: python stdout

我正在尝试编写一个返回值的python脚本,然后我可以将其传递给bash脚本。事情是我想要在bash中返回一个单值,但我想在途中向终端打印一些东西。

这是一个示例脚本。我们称之为return5.py:

#! /usr/bin/env python
print "hi"
sys.stdout.write(str(5))

我想要的是当我从命令行运行它时以这种方式执行:

~:five=`./return5.py`
hi
~:echo $five
5

但我得到的是:

~:five=`./return5.py`
~:echo $five
hi 5

换句话说,我不知道如何打印python脚本并清除标准输出,然后将其分配给我想要的特定值。

3 个答案:

答案 0 :(得分:9)

不确定为什么@yorodm建议不要使用stderr。在这种情况下,这是我能想到的最佳选择。

请注意,print会自动添加换行符,但是当您使用sys.stderr.write时,您需要自己添加"\n"

#! /usr/bin/env python
import sys


sys.stderr.write("This is an important message,")
sys.stderr.write(" but I dont want it to be considered")
sys.stderr.write(" part of the output. \n")
sys.stderr.write("It will be printed to the screen.\n")

# The following will be output.
print 5

使用此脚本如下所示:

bash$ five=`./return5.py`
This is an important message, but I dont want it to be considered part of the output.
It will be printed to the screen.
bash$ echo $five
5

这是有效的,因为终端确实向您展示了三个信息流:stdoutstdinstderr。 `cmd`语法表示“从此进程中捕获stdout”,但它不会影响stderr发生的情况。这是为了您正在使用它的目的而设计的 - 传达有关错误,警告或过程中发生的事情的信息。

您可能没有意识到终端中也会显示stdin,因为它只是您键入时显示的内容。但它不一定是那样。您可以想象在终端中键入并且没有显示任何内容。实际上,这正是您输入密码时所发生的情况。您仍在向stdin发送数据,但终端未显示数据。

答案 1 :(得分:2)

来自我的评论..

#!/usr/bin/env python
#foo.py 

import sys
print "hi"
sys.exit(5)

然后输出

[~] ./foo.py
hi
[~] FIVE=$?
[~] echo $FIVE
5

答案 2 :(得分:0)

您可以使用stdout输出消息,使用stderr捕获bash中的值。不幸的是,这是一些奇怪的行为,因为stderr旨在让程序传达错误消息,所以我强烈建议你反对它。

OTOH你总是可以用bash处理脚本输出