【问题标题】:getting python script to print to terminal without returning as part of stdout让 python 脚本打印到终端而不作为标准输出的一部分返回
【发布时间】:2014-04-16 19:16:43
【问题描述】:

我正在尝试编写一个 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 脚本打印并清除标准输出,然后将其分配给我想要的特定值。

【问题讨论】:

  • 我很困惑——如果不是标准输出,你认为终端是什么?如果您只需要它们在单独的行上,可以使用import sys; sys.stdout.flush()
  • 是你要返回到 shell 的总是一个数字吗?您可以使用 sys.exit(5) 并查看 $? 但这也是非标准行为
  • 数字退出代码在任何意义上都不是“非标准行为” - 这是一个非常成熟的概念。不过,某些环境可能会限制范围(例如 0-127)。
  • @AndrewMedico,这是非标准的,因为有一个严格的约定,即 0 表示“一切都很好”,非零表示错误情况。
  • 是的,我想要的是非标准的,因为 0 很好,其他的 == 哎呀

标签: python stdout


【解决方案1】:

不知道为什么@yorodm 建议不要使用标准错误。在这种情况下,这是我能想到的最佳选择。

注意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 发送数据,但终端没有显示它。

【讨论】:

    【解决方案2】:

    来自我的评论..

    #!/usr/bin/env python
    #foo.py 
    
    import sys
    print "hi"
    sys.exit(5)
    

    然后输出

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

    【讨论】:

      【解决方案3】:

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

      您总是可以在 bash 中处理您的脚本输出

      【讨论】:

        猜你喜欢
        • 2020-08-23
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 2013-05-01
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        • 2020-02-24
        相关资源
        最近更新 更多