【发布时间】:2010-10-02 16:47:35
【问题描述】:
我查看了this 并没有太大帮助。
我有一个向 cmd 行提出问题的 Ruby 程序,我想编写一个可以返回答案的 Python 程序。有谁知道任何链接或一般情况下我会如何去做?
感谢您的帮助。
编辑
感谢提到管道的人。我没有过多地使用它,很高兴它被提出来,因为它迫使我更多地关注它。
【问题讨论】:
-
你可以只使用一种语言,但如果你不知道 Ruby 知识,为什么不...
我查看了this 并没有太大帮助。
我有一个向 cmd 行提出问题的 Ruby 程序,我想编写一个可以返回答案的 Python 程序。有谁知道任何链接或一般情况下我会如何去做?
感谢您的帮助。
编辑
感谢提到管道的人。我没有过多地使用它,很高兴它被提出来,因为它迫使我更多地关注它。
【问题讨论】:
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]
【讨论】:
如果您使用的是 unix / linux,则可以使用管道:
question.rb | answer.py
那么question.rb的输出变成answer.py的输入
我最近没有尝试过,但我感觉同样的语法可能也适用于 Windows。
【讨论】:
期待
http://www.noah.org/wiki/Pexpect
Pexpect 是一个纯 Python 的 expect-like 模块。 Pexpect 让 Python 变得更好 控制其他的工具 应用程序。
Pexpect 是一个纯 Python 模块 产生子应用程序; 控制它们;并回应 输出中的预期模式。 Pexpect 的工作方式类似于 Don Libes 的 Expect。 Pexpect 允许您的脚本生成一个 子应用程序并像控制它一样 一个人正在输入命令。
【讨论】:
首先检查一下: [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
【讨论】:
| 字符构造管道,则数据以一种方式流动。但是您可以设置一个程序来同时使用输入和输出管道——事实上,这正是您的 Python 答案在幕后工作的方式。你不需要 Python。自 70 年代以来,Unix shell 就能够做到这一点。
| 字符。所以它没有回答这个问题。
有两种方法(我想不到)可以做到这一点。如果您在 Unix 环境中,最简单的方法是使用管道。简单例子:
cat .profile .shrc | more
这将使用管道字符 | 将第一个命令 (cat .profile .shrc) 的输出发送到 more 命令。
第二种方法是在源代码中调用另一个程序。我不知道 Ruby 是如何处理这个问题的,但是在 Python 中,您可以运行一个程序并使用 popen 函数获取它的输出。请参阅this example chapter from Learning Python,然后使用 Ctrl-F 表示“popen”以获取一些示例代码。
【讨论】: