我试图仅列出我的 Wi-Fi 网络适配器的 IP 地址,以便能够检测它是否已连接并且附加了 IP 地址。
有了它本身,它就可以工作了...|| |输出:
from subprocess import Popen
Popen([
'netsh',
'interface',
'ip',
'show',
'addresses',
'Wi-Fi'
]).communicate()
但是,有了这个...
Configuration for interface "Wi-Fi"
DHCP enabled: No
IP Address: 192.168.1.200
Subnet Prefix: 192.168.1.0/24 (mask 255.255.255.0)
Default Gateway: 192.168.1.1
Gateway Metric: 0
InterfaceMetric: 2
与列表中的或
from subprocess import Popen
Popen([
'netsh',
'interface',
'ip',
'show',
'addresses',
'Wi-Fi',
'|',
'findstr',
'/ir',
'IP Address'
]).communicate()
符号,它正在生成这个...
|
表明我输入了错误的适配器名称。| ||我已经尝试了列表中
Usage: show addresses [[name=]<string>]
Parameters:
Tag Value
name - The name or index of a specific interface.
Remarks: Displays the IP address configuration for an interface or
interfaces.
The information displayed for this command consists of:
Field Description
----- -----------
DHCP enabled Shows whether the address comes from static or DHCP
configuration.
IP Address Shows the IP address configured for an interface.
Subnet Mask Shows the subnet mask associated with the IP address.
Default Gateway Shows the IP address of a default gateway for the interface.
Gateway Metric Shows the metric for the default gateway shown above.
Only applies if multiple default gateways are configured.
Interface Metric Shows the metric for an interface.
Only applies if multiple interfaces are configured.
Examples:
show addresses "Wired Ethernet Connection"
参数的多种组合,但没有任何运气。
有人对此有任何见解吗?
netsh
目前我最好的猜测是 Popen 不知道如何处理 or
符号。
My best guess at the moment is that Popen doesn't know how to process the or
|
symbol.
问题在于正试图在单个
Popen
调用中使用管道字符 (
|
) 将一个命令的输出传递到另一个命令。在 Python 中,
|
运算符用于按位或操作,而不是用于 shell 管道。
要在 Python 中使用管道,需要创建
两个
Popen
对象,并将第一个对象的标准输出连接到第二个对象的标准输入。
以下代码展示了如何实现这一点:
from subprocess import Popen, PIPE
p1 = Popen([
'netsh',
'interface',
'ip',
'show',
'addresses',
'Wi-Fi'
], stdout=PIPE)
p2 = Popen([
'findstr',
'/ir',
'IP Address'
], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close() # 不再需要 p1 的 stdout
output = p2.communicate()[0]
print(output.decode())
代码解释:
-
创建两个
Popen
对象: -
p1
:运行netsh
命令,并将stdout
设置为PIPE
,表示将其输出捕获到管道中。 -
p2
:运行findstr
命令,并将stdin
设置为p1.stdout
,表示从p1
的输出中读取数据,并将stdout
设置为PIPE
,表示将其输出捕获到管道中。 -
关闭
p1
的 stdout: -
p1.stdout.close()
:关闭p1
的标准输出,告诉p2
数据已发送完毕。 -
读取
p2
的输出: -
output = p2.communicate()[0]
:从p2
的标准输出中读取数据。 -
打印输出:
-
print(output.decode())
:将输出解码为字符串并打印。
此代码将运行
netsh
命令,使用
findstr
命令过滤其输出,并打印包含 "IP Address" 的行。