.index在列表中看不到项目

父亲菲普斯

索引功能的新增功能。我正在尝试显示PC的主机名和IP地址,但是我停留在此索引部分。如果我将其注释掉并打印整个列表,那么我正在寻找的东西就在那里。那么.index为什么看不到呢?

#!/usr/bin/python3.6

import socket 
import string
import subprocess
import tkinter
from tkinter import *

hostname = socket.gethostname()

arg='ip route list'    
p=subprocess.Popen(arg,shell=True,stdout=subprocess.PIPE)
data = p.communicate()
sdata = data[0].split()
ipaddr = sdata[ sdata.index('src')+1 ]


root = tkinter.Tk()
root.title(hostname)

L1 = Label(root, text=ipaddr)
L1.grid(row=1,column=2,sticky=W+E,padx=100,pady=10)

root.mainloop()

sdata的内容:

[b'default', b'via', b'10.30.5.1', b'dev', b'ens33', b'proto', b'dhcp', 
b'metric', b'100', b'10.30.5.0/24', b'dev', b'ens33', b'proto', b'kernel', 
b'scope', b'link', b'src', b'10.30.5.7', b'metric', b'100', b'169.254.0.0/16', 
b'dev', b'ens33', b'scope', b'link', b'metric', b'1000']
科迪

看一下返回的内容p.communicate()

>>> p=subprocess.Popen(arg,shell=True,stdout=subprocess.PIPE)
>>> data = p.communicate()
>>> data
(b'default via 107.170.96.1 dev eth0 onlink \n10.8.0.0/24 via 10.8.0.2 dev tun0 \n10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1 \n107.170.96.0/20 dev eth0 proto kernel scope link src 107.170.105.131 \n', None)

请注意bstdout输出前缀,这意味着它不是Unicode编码的字符串,而是字节序列。这是在调出文档POpen.communicate

communication()返回一个元组(stdout_data,stderr_data)。如果以文本模式打开流,则数据将为字符串;否则,数据将为字符串。否则为字节。

拆分时data,它将因此返回字节序列的列表(请参阅每个项目还如何加上前缀b?):

>>> sdata = data[0].split()
>>> sdata
[b'default', b'via', b'107.170.96.1', b'dev', b'eth0', b'onlink', b'10.8.0.0/24', b'via', b'10.8.0.2', b'dev', b'tun0', b'10.8.0.2', b'dev', b'tun0', b'proto', b'kernel', b'scope', b'link', b'src', b'10.8.0.1', b'107.170.96.0/20', b'dev', b'eth0', b'proto', b'kernel', b'scope', b'link', b'src', b'107.170.105.131']

您传递给index,的'src'是字符串,而不是字节序列。这两个不相等:

>>> 'src' == 'src'
True
>>> 'src' == b'src'
False

因此,解决您的问题的一种方法是将字节序列传递b'src'index

>>> sdata.index(b'src')
18 

有关更多信息,请参见此SO问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章