让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
你可以用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
发送数据,但终端并不会显示出来。