如何从终端获取可读的命令输出

时间:2019-05-02 13:28:19

标签: python shell

我在使用该脚本时遇到了问题,我不知道如何描述它。 这是代码:

import subprocess
while True:
    imp = input(">>> ")
    proc = subprocess.Popen(imp, shell=True, stdout=subprocess.PIPE,)
    output = proc.communicate()[0]
    print(output)

如果您将ping 192.168.0.1输入,它将输出一个二进制数字,但我认为.decode("utf-8")函数不起作用

1 个答案:

答案 0 :(得分:3)

您需要使用decode来运行命令时获得的输出。 请注意,由于OP使用匈牙利语,因此编码为ISO-8859-2而不是utf-8

import subprocess
while True:
    imp = input(">>> ")
    proc = subprocess.Popen(imp, shell=True, stdout=subprocess.PIPE,)
    output = proc.communicate()[0]
    #Decode the binary string 
    print(output.decode('ISO-8859-2'))

示例输出为

>>> ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.045 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.045/0.045/0.045/0.000 ms

>>> 

新的编码可与OP的示例输出一起使用

s = b'\r\n192.168.0.1 pingel\x82se - 32 b\xa0jtnyi adattal:\r\nV\xa0lasz 192.168.0.1: b\xa0jt=32 id\x8b<10 ezredmp. TTL=64\r\nV\xa0lasz 192.168.0.1: b\xa0jt=32 id\x8b<10 ezredmp. TTL=64\r\nV\xa0lasz 192.168.0.1: b\xa0jt=32 id\x8b<10 ezredmp. TTL=64\r\nV\xa0lasz 192.168.0.1: b\xa0jt=32 id\x8b<10 ezredmp. TTL=64\r\n\r\n192.168.0.1 ping-statisztik\xa0ja:\r\n Csomagok: k\x81ld\x94tt = 4, fogadott = 4, elveszett = 0\r\n (0% vesztes\x82g),\r\nOda-vissza \xa3t ideje k\x94zel\xa1t\x8blegesen, milliszekundumban:\r\n minimum = 0ms, maximum = 0ms, \xa0tlag = 0ms\r\n'
print(s.decode('ISO-8859-2'))

输出为

192.168.0.1 pingelse - 32 b jtnyi adattal:
V lasz 192.168.0.1: b jt=32 id<10 ezredmp. TTL=64
V lasz 192.168.0.1: b jt=32 id<10 ezredmp. TTL=64
V lasz 192.168.0.1: b jt=32 id<10 ezredmp. TTL=64
V lasz 192.168.0.1: b jt=32 id<10 ezredmp. TTL=64

192.168.0.1 ping-statisztik ja:
 Csomagok: kldtt = 4, fogadott = 4, elveszett = 0
 (0% vesztesg),
Oda-vissza Łt ideje kzelĄtlegesen, milliszekundumban:
 minimum = 0ms, maximum = 0ms,  tlag = 0ms
相关问题