Python获取本机IP地址的三种方式

目录

1、使用专用网址

2、使用自带socket库

3、使用第三方netifaces库


1、使用专用网站

获取的是公网IP

网址:http://myip.ipip.net

代码:

python 复制代码
   
   
   
    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         import requests
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         res = requests.get(
         
         'https://myip.ipip.net', timeout=
         
         5).text
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         print(res)
        
        
        
       
       
       

   

   
   
   

具体可以类似这样:

python 复制代码
   
   
   
    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         import requests
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         import re
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
         
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         def 
         
         getOutterIP():
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
             ip = 
         
         ''    
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
            
         
         try:
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
                 res = requests.get(
         
         'https://myip.ipip.net', timeout=
         
         5).text
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
                 ip = re.findall(
         
         r'(\d+\.\d+\.\d+\.\d+)', res)
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
                 ip = ip[
         
         0] 
         
         if ip 
         
         else 
         
         ''
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
            
         
         except:
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
                
         
         pass
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
            
         
         return ip
        
        
        
       
       
       

   

   
   
   

比较喜欢用这个,在命令窗口也能使用:

bash 复制代码
curl https://myip.ipip.net
   
   
   

还可以用这个:https://api.ipify.org

2、使用自带socket库

获取的是局域网IP

python 复制代码
   
   
   
    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         import socket
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         # 函数 gethostname() 返回当前正在执行 Python 的系统主机名
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         res = socket.gethostbyname(socket.gethostname())
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         print(res)
        
        
        
       
       
       

   

   
   
   

但是上面这个获取的不是 公网IP,结果也不稳定(这里获取了虚拟机下的IP),不建议使用。

如果计算机设备有连接到 Internet 的路由,可以使用:

python 复制代码
   
   
   
    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         import socket
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         s.connect((
         
         "8.8.8.8", 
         
         80))
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         print(s.getsockname()[
         
         0])
        
        
        
       
       
       

   

   
   
   

这个获得的是局域网IP:

可以ipconfig看一下:

另一个适用于所有接口。它还适用于所有公共、私有、外部 IP。这种方法在 Linux、Windows 和 OSX 上很有效。

python 复制代码
   
   
   
    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         import socket
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         def 
         
         extract_ip():
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
             st = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
            
         
         try:       
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
                 st.connect((
         
         '10.255.255.255', 
         
         1))
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
                 IP = st.getsockname()[
         
         0]
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
            
         
         except Exception:
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
                 IP = 
         
         '127.0.0.1'
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
            
         
         finally:
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
                 st.close()
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
            
         
         return IP
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         print(extract_ip())
        
        
        
       
       
       

   

   
   
   

**注意:**如果本身局域网IP就是公网IP的话,那这个获得的,可以认为是公网IP了。

3、使用第三方netifaces库

获取的是局域网IP

netifaces 模块用于提供有关网络接口及其状态的信息。

代码:

没装的先装一下库

python 复制代码
pip3 install netifaces
   
   
   

然后使用

python 复制代码
   
   
   
    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         from netifaces 
         
         import interfaces, ifaddresses, AF_INET
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
         for ifaceName 
         
         in interfaces():
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
        
         
             addresses = [i[
         
         'addr'] 
         
         for i 
         
         in ifaddresses(ifaceName).setdefault(AF_INET, [{
         
         'addr':
         
         'No IP addr'}] )]
        
        
        
       
       
       

    
* 
       
       
       
        
        
        
       
       
       

       
       
       

        
        
            
         
         print(
         
         ' '.join(addresses))
        
        
        
       
       
       

   

   
   
   
相关推荐
oioihoii5 分钟前
C++数据竞争与无锁编程
java·开发语言·c++
资生算法程序员_畅想家_剑魔6 分钟前
Java常见技术分享-16-多线程安全-并发编程的核心问题
java·开发语言
We....6 分钟前
Java SPI 机制
java·开发语言
Blossom.1189 分钟前
GPTQ量化实战:从零手写大模型权重量化与反量化引擎
人工智能·python·算法·chatgpt·ai作画·自动化·transformer
Macbethad10 分钟前
区块链技术在分布式系统中的应用实践技术报告
开发语言·c#
福尔摩斯张20 分钟前
Linux的pthread_self函数详解:多线程编程中的身份标识器(超详细)
linux·运维·服务器·网络·网络协议·tcp/ip·php
Elaine33623 分钟前
实战教学:使用 Scrapy 爬取 CSDN 文章与用户头像
python·scrapy·网络爬虫
零雲25 分钟前
Java面试:@Component和@Bean的区别是什么
java·开发语言·面试
Jerry404_NotFound1 小时前
工厂方法模式
java·开发语言·jvm·工厂方法模式
微风欲寻竹影1 小时前
深入理解Java中的String
java·开发语言