我有一个试图执行外部程序的python脚本。 我的项目涉及一个python talk bot,客户端应该能够在远程终端中执行命令。
所以基本上包含talk bot的模块只允许我获取输入并发送输出。我需要接受输入并查看它是否是终端命令并执行它。
所以我使用了subprocess.Popen对象来实现它。
问题是,如果命令调用一个交互式的程序,即。等待输入并提供输出,我无法处理它。在最好的情况下,Popen等待所有输入,然后给出输出。
有没有办法正确地做到这一点,即。启动外部程序并发送输入,获取输出;发送输入,获取输出等。
答案 0 :(得分:0)
在我看来,针对此类问题的最佳模型是使用异步单线程方法,但它需要的代码即使使用帮助库也有些复杂。
在概念上更简单的是使用多线程方法
import thread
import sys
import time
def repl():
while True:
print ">>> ",
sys.stdout.flush()
s = raw_input()
exec s
def main_thread():
for i in xrange(30):
print i
time.sleep(1)
thread.start_new_thread(repl, ())
main_thread()
在上面的代码中,函数repl
等待输入,然后执行在提示符处输入的任何内容,但同时主程序正在运行(这里它没有做任何有趣的事情,只计算到30 )。
根据您的计划的复杂程度,这可能是一个合理的解决方案。请注意,在一定程度的并行执行和逻辑复杂性之后,多线程方法显示出一些缺点(复杂且难以调试锁定逻辑)
答案 1 :(得分:0)
pexpect可能就是您所需要的。