让Python脚本在终端打印而不作为stdout返回

9 投票
3 回答
25081 浏览
提问于 2025-04-18 03:01

我正在尝试写一个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

你可以用stdout来输出你的信息,用stderr来捕捉值,这在bash中是可以的。不过,这种做法有点奇怪,因为stderr本来是用来让程序传递错误信息的,所以我强烈建议你不要这样做。

另一方面,你总是可以在bash中处理你的脚本输出。

2

根据我之前的评论..

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

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

然后输出的结果是

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

我不太明白为什么@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

之所以这样有效,是因为终端实际上显示了三种信息流:stdout(标准输出)、stdin(标准输入)和stderr(标准错误)。`cmd`语法的意思是“捕获这个进程的stdout”,但这并不会影响stderr的处理。这正是为了你现在要做的事情而设计的——传达关于错误、警告或进程内部情况的信息。

你可能没有意识到stdin也在终端中显示,因为它就是你输入时出现的内容。但其实不一定非得这样。你可以想象在终端中输入时什么都不显示。实际上,当你输入密码时就是这种情况。你仍然在向stdin发送数据,但终端并不会显示出来。

撰写回答