【问题标题】:Interactive shell program wrapper in pythonpython中的交互式shell程序包装器
【发布时间】:2016-09-17 08:35:05
【问题描述】:

我正在尝试通过 python 运行一个 shell 程序。我需要运行一个命令,然后当它仍在运行并等待输入继续时,我需要获取程序接收到的输出,并将该数据作为字符串处理。然后我需要将一些数据解析到该程序中,并模拟输入。 实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: python linux python-2.7 shell


    【解决方案1】:

    subprocess.Popen 可以解决这个问题,但是读取然后写入然后再读取你不能使用communicate(因为这会导致进程结束)。

    相反,您需要使用进程的输出管道(下面的process.stdout)。这很难做到正确,因为读取进程的stdoutblocking,所以你需要知道何时停止尝试读取(或知道进程将产生多少输出)。

    在这个例子中,子进程是一个 shell 脚本,它写入一行输出,然后回显你给它的任何内容,直到它读取 EOF。

    import subprocess
    
    COMMAND_LINE = 'echo "Hello World!" ; cat'
    
    process = subprocess.Popen(COMMAND_LINE, shell=True,
                               stdin=subprocess.PIPE,
                               stdout=subprocess.PIPE)
    
    s = process.stdout.readline().strip()
    print(s)
    s2 = process.communicate(s)[0]
    print(s2)
    

    给予:

    Hello World!
    Hello World!
    

    对于更复杂的情况,您可能会考虑查看 pexpect 之类的内容。

    【讨论】:

      【解决方案2】:

      使用subprocess.Popen 运行您的shell 应用程序并使用communicate 与之交互。

      【讨论】:

      • 如果要输出为字符串,不要忘记使用universal_newlines=True(默认为False,这会导致子进程返回字节)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 2010-12-06
      • 2013-08-22
      • 2011-09-01
      • 1970-01-01
      相关资源
      最近更新 更多