从python脚本运行外部交互程序



我有一个python脚本,它试图执行外部程序。我的项目涉及一个python聊天机器人,通过它,客户端应该能够在远程终端执行命令。

所以基本上包含聊天机器人的模块只允许我获得输入和发送输出。我需要接受输入,看看它是否是一个终端命令并执行它。

所以我使用子进程。Popen对象来实现。

问题是,如果命令调用的程序是交互式的,即。等待输入并给出输出,我无法处理它。在最好的情况下,Popen等待所有输入,然后给出输出。

是否有一种方法可以正确地做到这一点?启动外部程序,发送输入,获取输出;发送输入,获取输出等

pexpect可能就是您需要的。

在我看来,这类问题的最佳模型是使用异步单线程方法,但即使使用帮助库,它也需要一些复杂的代码。

概念上更简单的是使用多线程方法

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)。

根据程序的复杂程度,这可能是一个合理的解决方案。注意,在一定程度的并行执行和逻辑复杂性之后,多线程方法显示出一些缺点(复杂且难以调试锁定逻辑)

最新更新