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

1 投票
2 回答
1710 浏览
提问于 2025-04-16 21:42

我有一个Python脚本,它试图执行外部程序。我的项目是一个Python聊天机器人,客户可以通过它在远程终端执行命令。

简单来说,这个聊天机器人模块只让我获取输入和发送输出。我需要接收输入,判断它是否是一个终端命令,然后执行它。

为此,我使用了subprocess.Popen这个对象来实现。

问题是,如果命令调用的程序是交互式的,也就是说它需要等待输入并给出输出,我就无法处理了。在最好的情况下,Popen会等到所有输入都给完后再输出结果。

有没有什么好的方法可以做到这一点呢?也就是说,启动一个外部程序,发送输入,获取输出;再发送输入,获取输出,依此类推。

2 个回答

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

根据你的程序复杂程度,这可能是一个合理的解决方案。不过要注意,当并行执行和逻辑复杂度达到一定程度时,多线程的方法会有一些缺点,比如锁定逻辑复杂且难以调试。

0

pexpect 可能正是你需要的工具。

撰写回答