【问题标题】:How do I take the output of one program and use it as the input of another?如何获取一个程序的输出并将其用作另一个程序的输入?
【发布时间】:2010-10-02 16:47:35
【问题描述】:

我查看了this 并没有太大帮助。

我有一个向 cmd 行提出问题的 Ruby 程序,我想编写一个可以返回答案的 Python 程序。有谁知道任何链接或一般情况下我会如何去做?

感谢您的帮助。

编辑
感谢提到管道的人。我没有过多地使用它,很高兴它被提出来,因为它迫使我更多地关注它。

【问题讨论】:

  • 你可以只使用一种语言,但如果你不知道 Ruby 知识,为什么不...

标签: python ruby io


【解决方案1】:
p = subprocess.Popen(['ruby', 'ruby_program.rb'], stdin=subprocess.PIPE, 
                                          stdout=subprocess.PIPE)
ruby_question = p.stdout.readline()
answer = calculate_answer(ruby_question)
p.stdin.write(answer)
print p.communicate()[0]  # prints further info ruby may show.

最后两行可以合二为一:

print p.communicate(answer)[0]

【讨论】:

  • 如果您希望 python 程序“处于控制之中”,这很好。
  • @zacherates:这是您通常想要的,不是吗?我确信有办法从红宝石方面做同样的事情。
  • @Aaron:是的,添加了信息。谢谢。
【解决方案2】:

如果您使用的是 unix / linux,则可以使用管道:

question.rb | answer.py

那么question.rb的输出变成answer.py的输入

我最近没有尝试过,但我感觉同样的语法可能也适用于 Windows。

【讨论】:

  • 嗯...我不认为 OP 要求第二个程序返回并回答 ruby 程序。我想这取决于你如何理解“return”。
【解决方案3】:

期待

http://www.noah.org/wiki/Pexpect

Pexpect 是一个纯 Python 的 expect-like 模块。 Pexpect 让 Python 变得更好 控制其他的工具 应用程序。

Pexpect 是一个纯 Python 模块 产生子应用程序; 控制它们;并回应 输出中的预期模式。 Pexpect 的工作方式类似于 Don Libes 的 Expect。 Pexpect 允许您的脚本生成一个 子应用程序并像控制它一样 一个人正在输入命令。

【讨论】:

    【解决方案4】:

    首先检查一下: [Unix管道][1]

    它可以在 windows 或 unix 上运行,但有点不同,首先是程序:

    question.rb:

    puts "This is the question"
    

    answer.rb:

    question = gets
    #calculate answer
    puts "This is the answer"
    

    然后是命令行:

    在 unix 中:

    question.rb | answer.rb
    

    在窗口中:

    ruby question.rb | ruby answer.rb
    

    输出:

    This is the question
    This is the answer
    

    【讨论】:

    • -1:使用管道意味着数据单向传输。他特地要求返回数据
    • 不,不是,我的理解是他需要从另一个进程中获取问题,这是自 70 年代以来的方式,您的答案受到更多控制,但几乎等同于这个一。无论如何,我改进了示例。
    • @krusty.ar:他有问题地提到 python 程序必须以某种方式返回 ruby​​ 程序的答案。所以 -1 代表。
    • @nosklo:如果您仅使用管道 | 字符构造管道,则数据以一种方式流动。但是您可以设置一个程序来同时使用输入和输出管道——事实上,这正是您的 Python 答案在幕后工作的方式。你不需要 Python。自 70 年代以来,Unix shell 就能够做到这一点。
    • @Daniel Pryden:我不明白你的意思。我的意思是,是的,但是这个答案并没有做到这一点。它使用管道| 字符。所以它没有回答这个问题。
    【解决方案5】:

    有两种方法(我想不到)可以做到这一点。如果您在 Unix 环境中,最简单的方法是使用管道。简单例子:

    cat .profile .shrc | more
    

    这将使用管道字符 | 将第一个命令 (cat .profile .shrc) 的输出发送到 more 命令。

    第二种方法是在源代码中调用另一个程序。我不知道 Ruby 是如何处理这个问题的,但是在 Python 中,您可以运行一个程序并使用 popen 函数获取它的输出。请参阅this example chapter from Learning Python,然后使用 Ctrl-F 表示“popen”以获取一些示例代码。

    【讨论】:

    • -1:使用管道意味着数据单向传输。他特地要求返回数据
    • 这就是我给出两种可能解决方案的原因之一。
    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 2010-11-27
    • 2015-08-31
    • 2022-01-15
    • 2016-09-27
    • 2021-11-20
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多