【问题标题】:Transparent interaction with console (sh,bash,cmd,powershell)与控制台的透明交互(sh、bash、cmd、powershell)
【发布时间】:2017-01-01 14:40:31
【问题描述】:

请帮我用python编写简单的控制台应用程序。它应该将所有输入重定向到系统 shell(bash 或 windows cmd 或 powershell)并将它们的所有输出提供给屏幕。 简单地说,我可以说从 python 应用程序运行终端。

下一个代码会出现一些奇怪的行为:前 3 次按下任何键后它会输出(执行?)一些先前的命令(可能来自缓存)

#!/bin/python3

import subprocess
import sys

proc = subprocess.Popen(['bash'])
while True:
    buff = sys.stdin.readline()
    stdoutdata, stderrdata = proc.communicate(buff)
    if( stdoutdata ):
        print( stdoutdata )
    else:
        print('n')
        break

【问题讨论】:

  • 我在发布问题后编写的代码。我知道没有代码的问题看起来很简单。有问题的时候我没有想法。 @grael,如果这很粗鲁,请原谅我。
  • @kyb 没关系,既然您添加了代码,我就删除了该评论:)
  • 当我使用 subprocess.Popen(['cmd]) 从 Windows PowerShell 运行此脚本时,它可以正常工作。使用Ctrl+B 运行的 Sublime Text 在 Linux 和 Windows 下显示黑死控制台。
  • SublimeREPL 一起工作,而没有PIPEs

标签: python python-3.x terminal subprocess


【解决方案1】:

我认为你需要

proc = subprocess.Popen(['bash'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

来自docs

PIPE 表示应该创建一个通往子级的新管道。 DEVNULL 表示将使用特殊文件 os.devnull。和 默认设置为None,不会发生重定向;孩子的 文件句柄将从父级继承。

我认为您不希望您的 bash 直接连接到您的父进程的标准输入。这可以解释怪异。

【讨论】:

  • 我试过了。这会在第一次输入时产生错误:Traceback (most recent call last): File "./devel/python/terminal/terminal2.py", line 11, in <module> stdoutdata, stderrdata = proc.communicate(buff) File "/usr/lib/python3.5/subprocess.py", line 1072, in communicate stdout, stderr = self._communicate(input, endtime, timeout) File "/usr/lib/python3.5/subprocess.py", line 1700, in _communicate input_view = memoryview(self._input) TypeError: memoryview: a bytes-like object is required, not 'str'
  • 发生了一些奇怪的事情 - 来自不同环境的不同结果(它适用于我)
猜你喜欢
  • 1970-01-01
  • 2015-01-20
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多