确定计算机是否通过WiFi网络或Python中的以太网电缆连接到internet
我想知道如何让Python脚本确定计算机如何连接到网络。这是因为如果连接速度太慢,脚本就会出现问题,因此如果用户通过WiFi连接,我想显示一个警告 实际运行的Python可执行文件位于我公司的局域网上,因此这就是连接速度很重要的原因。此外,由于此可执行文件在没有连接的情况下无法运行,因此我不关心检查用户是否在线 我不知道Python是如何与这样的东西交互的(或者即使可能),所以如果有什么我可以澄清的,请告诉我。提前谢谢确定计算机是否通过WiFi网络或Python中的以太网电缆连接到internet,python,windows,Python,Windows,我想知道如何让Python脚本确定计算机如何连接到网络。这是因为如果连接速度太慢,脚本就会出现问题,因此如果用户通过WiFi连接,我想显示一个警告 实际运行的Python可执行文件位于我公司的局域网上,因此这就是连接速度很重要的原因。此外,由于此可执行文件在没有连接的情况下无法运行,因此我不关心检查用户是否在线 我不知道Python是如何与这样的东西交互的(或者即使可能),所以如果有什么我可以澄清的,请告诉我。提前谢谢 我在Windows 7上使用的是Python 2.7.6 32位64位(不同
我在Windows 7上使用的是Python 2.7.6 32位64位(不同的位是因为pyEnchant)在Windows上,此信息通过WMI提供 在.NET中(例如,使用IronPython),这很容易使用:
ni = Windows.Networking.Connectivity.NetworkInformation
profile = ni.GetInternetConnectionProfile()
if profile:
interface = profile.NetworkAdapter.IanaInterfaceType
if interface == 71:
do WiFi stuff
elif interface == 6:
do Ethernet stuff
else:
do wtf stuff
IanaInterfaceType
是来自的数字。(我想您可以解析SNMP MIB。)注意,Windows可能会将一些不太常见/过时的适配器类型与以太网混为一谈,但您可能并不关心这一点
对于旧版本的Windows—我不确定Windows 7是否算作“旧版”和您想要的朋友,而不是上面链接的
MSFT\u NetworkAdapter
/NetworkAdapter
,因此代码会有所不同
特别是,获取提供默认internet连接的适配器更难,但更灵活,而获取其类型更容易,但信息量较少。IIRC,至少在XP中,尽管Windows有一些“internet连接”的概念,但您无法通过WMI访问它,但您可以访问所有internet连接,或搜索/迭代您关心的连接。如果你有一个VPN,或者坐在一个DMZ上,或者一次激活多个NIC卡,等等,哪一个更好
因此,您要做的是搜索或迭代以找到哪个连接路由处理您实际要连接的IP地址,或者使用哪个NIC处理您要连接的地址。无论哪种方式,您都将获得一个接口索引
,您可以使用该接口索引
查找。那么它的AdapterType
是一个很好的字符串,您只需检查!=“无线”
。(我相信我从上一个VBscript示例中了解到了所有这些,然后自己将其移植到IronPython,但那是很久以前的事了,所以我可能记错了。无论如何,文档似乎比当时更完整,所以这应该是不必要的。)
如果没有.NET(例如,使用标准的CPython),则必须使用web服务接口,或与本机Win32 COM接口对话 理论上,您可以通过
ctypes
直接与COM接口通信,但这是一个可怕的想法;你几乎肯定会想要那样
而且,更好的是,我建议在PyPI上查找包装器,比如,而不是自己构建它。然后,代码应该和.NET一样简单
下面是一些使用上面链接的WMI库和上面描述的XP兼容源地址方法的pseudcode:
import wmi
MY_IP = '10.1.2.3'
w = wmi.WMI()
for nac in w.Win32_NetworkAdapterConfiguration():
if MY_IP in nac.IPAddress:
idx = nac.InterfaceIndex
break
else:
oops, do something, no NIC has that address
na = w.Win32_NetworkAdapter(InterfaceIndex=idx)
if not na:
oops, unlikely race condition, NIC disabled right before we checked it
if na[0].AdapterType == 'Wireless':
do WiFi stuff
elif na[0].AdapterType.startswith('Ethernet'):
do Ethernet stuff
else:
who's using LocalTalk in 2013?
应该可以搜索NetworkAddressConfiguration,但我不知道如何在wmi
库中搜索“IPAddress包含我的IP”。使用=
可能在那里有效,谁知道呢;通读这本书来找出答案
另一方面,按目标地址搜索应如下所示:
TARGET_IP = '10.10.10.10'
w = wmi.WMI()
rt = w.Win32_IP4RouteTable(Destination=TARGET_IP)
if not rt:
oops, no route to host
idx = rt[0].InterfaceIndex
# same as above
在Windows上,此信息通过WMI提供 在.NET中(例如,使用IronPython),这很容易使用:
ni = Windows.Networking.Connectivity.NetworkInformation
profile = ni.GetInternetConnectionProfile()
if profile:
interface = profile.NetworkAdapter.IanaInterfaceType
if interface == 71:
do WiFi stuff
elif interface == 6:
do Ethernet stuff
else:
do wtf stuff
IanaInterfaceType
是来自的数字。(我想您可以解析SNMP MIB。)注意,Windows可能会将一些不太常见/过时的适配器类型与以太网混为一谈,但您可能并不关心这一点
对于旧版本的Windows—我不确定Windows 7是否算作“旧版”和您想要的朋友,而不是上面链接的
MSFT\u NetworkAdapter
/NetworkAdapter
,因此代码会有所不同
特别是,获取提供默认internet连接的适配器更难,但更灵活,而获取其类型更容易,但信息量较少。IIRC,至少在XP中,尽管Windows有一些“internet连接”的概念,但您无法通过WMI访问它,但您可以访问所有internet连接,或搜索/迭代您关心的连接。如果你有一个VPN,或者坐在一个DMZ上,或者一次激活多个NIC卡,等等,哪一个更好
因此,您要做的是搜索或迭代以找到哪个连接路由处理您实际要连接的IP地址,或者使用哪个NIC处理您要连接的地址。无论哪种方式,您都将获得一个接口索引
,您可以使用该接口索引
查找。那么它的AdapterType
是一个很好的字符串,您只需检查!=“无线”
。(我相信我从上一个VBscript示例中了解到了所有这些,然后自己将其移植到IronPython,但那是很久以前的事了,所以我可能记错了。无论如何,文档似乎比当时更完整,所以这应该是不必要的。)
如果没有.NET(例如,使用标准的CPython),则必须使用web服务接口,或与本机Win32 COM接口对话 理论上,您可以通过
ctypes
直接与COM接口通信,但这是一个可怕的想法;你几乎肯定会想要那样
而且,更好的是,我建议在PyPI上查找包装器,比如,而不是自己构建它。然后,代码应该和.NET一样简单
下面是一些pseudcode,它使用上面链接的WMI库和XP兼容的源地址me