获取流输出,错误,允许用户输入subprocess.Popen

时间:2018-03-25 01:47:39

标签: python python-3.x subprocess python-3.6

我正在尝试通过python运行shell命令并获取其输出,错误消息并允许用户在被询问时输入是/否。

我和测试它的命令是

cp dummy dummy2 -i

理想情况下,我需要一种pythonic和最新(python3.6)方式,不需要安装额外的软件或库。

贝娄是我的一些尝试:

# input  yes
# output no
# error  no
os.system(cmd)

# input  yes
# output no
# error  no
try:
    subprocess.run(cmd, check=True, shell=True, bufsize=1, universal_newlines=True)
except Exception as e:
    print(e)

上面的代码似乎是来自文档的推荐方式,但是当设置stdout和stderr时,输入不再起作用。更具体地说,程序将等待我的输入但不打印文本,要求我输入。

# input  no
# output yes
# error  yes
try:
    p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE ,check=True, shell=True, bufsize=1, universal_newlines=True)
    print(p.stdout)
except Exception as e:
    print(e.stderr)

使用Popen应该更灵活,但如果我设置stderr,我会遇到与之前相同的问题。

# input  yes
# output yes
# error  no
process = subprocess.Popen(
    cmd,
    stdout=subprocess.PIPE,
    shell=True,
    bufsize=1,
    universal_newlines=True)
out, err = process.communicate()
print('out: ')
print(out)
print('err: ')
print(err)

程序等待我的输入,但在我按回车键之前没有显示任何内容。

# input  no
# output yes
# error  yes
process = subprocess.Popen(
    cmd,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    shell=True,
    bufsize=1,
    universal_newlines=True)
out, err = process.communicate()
print('out: ')
print(out)
print('err: ')
print(err)

0 个答案:

没有答案