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))
        
        
        
       
       
       

   

   
   
   
相关推荐
程序媛kelly4 分钟前
如何打开 .md / .ipynb 文件?Markdown 与 Jupyter Notebook 本地预览全攻略
ide·python·jupyter
KaMeidebaby9 分钟前
卡梅德生物技术快报 | Fab 合成文库构建与抗体筛选实验流程及数据解析
人工智能·python·tcp/ip·算法·机器学习
装不满的克莱因瓶11 分钟前
掌握3D CNN模型结构——从时空特征建模到视频理解与医学影像核心架构
人工智能·pytorch·python·深度学习·神经网络·3d·cnn
AI科技星11 分钟前
氢原子基态能级跃迁紫外频段光子频率计算
开发语言·网络·量子计算·agi·拓扑学
AINative软件工程12 分钟前
LLM 应用的 Schema 演进工程:structured output 字段改了,下游为什么炸了?
后端·python·架构
devilnumber18 分钟前
Java Lambda 表达式 200 条常见问题、坑点、易错点、规范清单
java·开发语言
zzz_236821 分钟前
【Java基础】二叉树遍历与红黑树的完美平衡艺术——从递归崩溃到自平衡的硬核拆解
java·开发语言
程序员zgh22 分钟前
C++ 万能引用与完美转发
c语言·开发语言·c++·经验分享·学习
法海爱捉虫24 分钟前
小微企业 / 货代专用快递打单工具,适配热敏 / A4 打印机 功能设计
python
Chris-zz27 分钟前
lua流程控制
开发语言·lua