Python新手用os.system获取网卡IP遇语法错误求助
解决:用os模块获取ens33网卡IP地址
1. 语法错误的原因
你写的代码里,awk命令的单引号'和外层包裹整个命令的单引号冲突了——Python会误以为字符串在awk的单引号位置就结束了,所以抛出语法错误。
2. 修正命令行并正确获取输出
首先要明确:os.system()只能返回命令的退出状态码(0代表成功,非0代表失败),拿不到命令的输出内容。要获取IP,得用os.popen()(属于os模块,符合你仅用os/sys的要求)。
这里给两种修正命令字符串的方式:
- 方式一:转义awk里的单引号
import os # 把awk部分的单引号用反斜杠转义,避免和外层单引号冲突 cmd = '/sbin/ifconfig ens33 | grep "inet" |awk \'/inet / { print $2 }\'' # 用os.popen读取命令输出,strip()去掉多余的换行和空格 ip_address = os.popen(cmd).read().strip() print(ip_address)
- 方式二:用双引号包裹整个命令,转义内部的双引号
import os cmd = "/sbin/ifconfig ens33 | grep \"inet\" |awk '/inet / { print $2 }'" ip_address = os.popen(cmd).read().strip() print(ip_address)
3. 纯Python解析(不用shell管道)
如果不想依赖shell的管道命令,也可以直接读取ifconfig的全部输出,用Python字符串处理提取IP:
import os # 获取ens33网卡的完整ifconfig输出 output = os.popen('/sbin/ifconfig ens33').read() # 逐行筛选出包含inet且不是inet6的行 for line in output.split('\n'): if 'inet ' in line and 'inet6' not in line: # 分割行内容,提取第二个字段就是IP ip_address = line.strip().split()[1] print(ip_address) break
内容的提问来源于stack exchange,提问作者learnstuffnow49
相关产品推荐
相关产品推荐

