加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Python 3.4.3 subprocess.Popen获取命令输出而不管道?

发布时间:2020-12-13 19:16:19 所属栏目:Linux 来源:网络整理
导读:我试图将命令的输出分配给变量,而不会让命令认为它正在被管道传输.这样做的原因是,如果正在通过管道传输,有问题的命令会将未格式化的文本作为输出,但如果从终端运行,则会给出颜色格式化的文本.我需要得到这种颜色格式的文本. 到目前为止,我已经尝试了一些事

我试图将命令的输出分配给变量,而不会让命令认为它正在被管道传输.这样做的原因是,如果正在通过管道传输,有问题的命令会将未格式化的文本作为输出,但如果从终端运行,则会给出颜色格式化的文本.我需要得到这种颜色格式的文本.

到目前为止,我已经尝试了一些事情.我这样试过Popen:

output = subprocess.Popen(command,stdout=subprocess.PIPE)
output = output.communicate()[0]
output = output.decode()
print(output)

这将让我打印输出,但它给我输出管道命令时得到的无格式输出.这是有道理的,因为我在Python代码中管它.但我很好奇是否有办法将此命令的输出直接分配给变量,而没有运行自身管道版本的命令.

我还尝试了以下依赖于check_output的版本:

output = subprocess.check_output(command)
output = output.decode()
print(output)

而且,当命令通过管道输出时,我得到了与命令返回的相同的无格式输出.

有没有办法获得格式化输出,命令通常从终端提供的输出,当它没有被管道?

最佳答案
使用pexpect:

2.py:

import sys

if sys.stdout.isatty():
    print('hello')
else:
    print('goodbye')

子:

import subprocess

p = subprocess.Popen(
    ['python3.4','2.py'],stdout=subprocess.PIPE
)

print(p.stdout.read())

--output:--
goodbye

Pexpect的:

import pexpect

child = pexpect.spawn('python3.4 2.py')

child.expect(pexpect.EOF)
print(child.before)  #Print all the output before the expectation.

--output:--
hello

这里是grep –colour = auto:

import subprocess

p = subprocess.Popen(
    ['grep','--colour=auto','hello','data.txt'],stdout=subprocess.PIPE
)

print(p.stdout.read())

import pexpect

child = pexpect.spawn('grep --colour=auto hello data.txt')
child.expect(pexpect.EOF)
print(child.before)

--output:--
b'hello worldn'
b'x1b[01;31mhellox1b[00m worldrn'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读