Python3.10动态修改Windows系统(win10/win11)本地IP地址(静态IP)

文章介绍了如何使用Python3.10脚本动态修改本地服务器的静态IP地址,通过获取网卡信息,利用netsh命令进行IP地址的设置,从而减少了手动配置的繁琐,并讨论了静态IP在特定场景下的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般情况下,局域网里的终端比如本地服务器设置静态IP的好处是可以有效减少网络连接时间,原因是过程中省略了每次联网后从DHCP服务器获取IP地址的流程,缺点是容易引发IP地址的冲突,当然,还有操作层面的繁琐,如果想要切换静态IP地址,就得去网络连接设置中手动操作,本次我们使用Python3.10动态地修改电脑的静态IP地址。

获取多网卡配置

一个网卡对应一个静态IP地址,但机器上未必只有一个网卡,所以如果想动态切换,必须要指定网卡名称,Win系统中通过ipconfig命令来获取当前系统的网卡信息:

ipconfig

系统返回:

PS C:\Users\liuyue\h2102-a\videopro> ipconfig  
  
Windows IP 配置  
  
  
以太网适配器 以太网:  
  
   连接特定的 DNS 后缀 . . . . . . . :  
   本地链接 IPv6 地址. . . . . . . . : fe80::a216:f22a:52a:3388%4  
   IPv4 地址 . . . . . . . . . . . . : 192.168.1.104  
   子网掩码  . . . . . . . . . . . . : 255.255.255.0  
   默认网关. . . . . . . . . . . . . : 192.168.1.1  
  
以太网适配器 以太网 2:  
  
   连接特定的 DNS 后缀 . . . . . . . :  
   IPv6 地址 . . . . . . . . . . . . : fdb2:2c26:f4e4:0:7703:1e08:e622:2f0  
   临时 IPv6 地址. . . . . . . . . . : fdb2:2c26:f4e4:0:717c:b59e:b6cd:51b2  
   本地链接 IPv6 地址. . . . . . . . : fe80::2645:f265:ad72:c751%16  
   IPv4 地址 . . . . . . . . . . . . : 192.168.0.118  
   子网掩码  . . . . . . . . . . . . : 255.255.255.0  
   默认网关. . . . . . . . . . . . . :  
  
以太网适配器 vEthernet (Default Switch):  
  
   连接特定的 DNS 后缀 . . . . . . . :  
   本地链接 IPv6 地址. . . . . . . . : fe80::3ece:9b38:2572:4e33%18  
   IPv4 地址 . . . . . . . . . . . . : 172.31.16.1  
   子网掩码  . . . . . . . . . . . . : 255.255.240.0  
   默认网关. . . . . . . . . . . . . :

如果想通过Python来获取网卡信息,则需要在脚本中运行ipconfig命令,构建change_ip.py脚本:

import os,re  
  
class IpManage:  
  
    def __init__(self):  
  
        self.ip_list = self.get_ip()  
  
  
    def get_ip(self):  
  
  
        result = os.popen('ipconfig')  
        res = result.read()  
  
        resultlist = re.findall('''(?<=以太网适配器 ).*?(?=:)|(?<=无线局域网适配器 ).*?(?=:)''', res)  
  
        print(resultlist)  
  
        return resultlist  
  
if __name__ == '__main__':  
      
    IpManage()

这里通过os模块的popen方法来运行ipconfig命令,随后再使用正则来匹配网卡名称,最后将匹配到的网卡列表赋值给实例属性,程序返回:

['以太网', '以太网 2', 'vEthernet (Default Switch)']  
[Finished in 394ms]

至此,三块网卡的名称就获取到了。

动态切换静态IP

接下来就是通过Python脚本来动态切换指定网卡的静态IP地址了,Windows系统通过netsh命令来指定IP地址:

netsh interface ip set address name=以太网 static 192.168.201.137 255.255.248.0 192.168.200.1

这里name参数是网卡名称,后来三个地址分别代表静态IP地址,子网掩码以及网关地址。

这里将第一块网卡的静态IP地址设置为192.168.201.137,子网掩码是255.255.248.0,网关地址为192.168.200.1。

随后在Windows的网络连接设置中进行查看:

发现已经设置好了,随后再手动修改为自动获得IP地址选项。

下面通过Python脚本进行设置:

def set_ip(self,name,ip="192.168.201.137",mask="255.255.248.0",gateway="192.168.200.1"):  
  
        result = os.popen(f"netsh interface ip set address name={name} static {ip} {mask} {gateway}")  
        res = result.read()  
  
        print(res)

这里添加一个实例方法来设置ip地址,同样使用popen方法来运行命令,随后进行调用:

if __name__ == '__main__':  
      
    im = IpManage()  
  
    im.set_ip(im.ip_list[0])

这里将第一块网卡的IP地址进行指定操作。

完整代码:

import os,re  
  
class IpManage:  
  
    def __init__(self):  
  
        self.ip_list = self.get_ip()  
  
  
    def set_ip(self,name,ip="192.168.201.137",mask="255.255.248.0",gateway="192.168.200.1"):  
  
        result = os.popen(f"netsh interface ip set address name={name} static {ip} {mask} {gateway}")  
        res = result.read()  
  
  
  
    def get_ip(self):  
  
  
        result = os.popen('ipconfig')  
        res = result.read()  
  
        resultlist = re.findall('''(?<=以太网适配器 ).*?(?=:)|(?<=无线局域网适配器 ).*?(?=:)''', res)  
  
        print(resultlist)  
  
        return resultlist  
  
if __name__ == '__main__':  
      
    im = IpManage()  
  
    im.set_ip(im.ip_list[0])

结语

藉此,我们就可以通过Python3.10动态地配置本地网卡的静态IP地址,也可以理解为是一种Python自动化流程,静态IP地址可以让IP地址语义化,对于数据中心、网站、银行的结算端口等往往需要静态IP,与此同时,也省却了手动配置静态IP的繁琐过程。

ERROR: Exception: Traceback (most recent call last): File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/base_command.py", line 173, in _main status = self.run(options, args) File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/req_command.py", line 203, in wrapper return func(self, options, args) File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/commands/install.py", line 266, in run session = self.get_default_session(options) File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/req_command.py", line 74, in get_default_session self._session = self.enter_context(self._build_session(options)) File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/req_command.py", line 88, in _build_session session = PipSession( File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/network/session.py", line 289, in __init__ self.headers["User-Agent"] = user_agent() File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/network/session.py", line 132, in user_agent linux_distribution = distro.linux_distribution() # type: ignore File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 125, in linux_distribution return _distro.linux_distribution(full_distribution_name) File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 681, in linux_distribution self.version(), File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 741, in version self.lsb_release_attr(&#39;release&#39;), File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 903, in lsb_release_attr return self._lsb_release_info.get(attribute, &#39;&#39;) File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 556, in __get__ ret = obj.__dict__[self._fname] = self._f(obj) File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 1014, in _lsb_release_info stdout = subprocess.check_output(cmd, stderr=devnull) File "/usr/local/python3.10/lib/python3.10/subprocess.py", line 420, in check_output return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, File "/usr/local/python3.10/lib/python3.10/subprocess.py", line 524, in run raise CalledProcessError(retcode, process.args, subprocess.CalledProcessError: Command &#39;(&#39;lsb_release&#39;, &#39;-a&#39;)&#39; returned non-zero exit status 1.
07-23
<think>嗯,用户遇到了pip安装包时的subprocess.CalledProcessError错误,具体是执行&#39;lsb_release -a&#39;命令失败。这个错误在Python包管理过程中挺常见的,需要帮用户找到可靠的解决方案。 从用户提供的引用来看,有几个关键点值得注意:引用[1]和[2]都提到了删除/usr/bin/lsb_release文件的方法;引用[3]则提供了修改pip源码的方案;引用[5]提到复制lsb_release.py的方法无效。这些引用质量参差不齐,需要帮用户筛选最稳妥的方案。 用户可能是在Linux环境下进行Python包安装时遇到这个问题,特别是使用sudo pip3 install命令时。考虑到用户可能是开发者,解决方案需要尽量保持系统完整性。最安全的方案应该是修改pip的distro.py文件,而不是直接删除系统文件。 我注意到引用[3]提供了具体修改方法:找到distro.py文件的__init__方法,将include_lsb参数默认值从True改为False。这个方案不会影响系统其他功能,应该作为首选方案推荐给用户。同时也要提醒用户注意文件路径可能因Python版本而异。 作为备选方案,可以提及临时删除lsb_release文件的方法,但要强调这是最后手段,因为可能影响其他依赖lsb_release的系统功能。用户引用[1]和[2]都提到这个方法,但风险较高。 在回答组织上,应该先解释错误原因:pip在安装时尝试获取系统发行版信息,而lsb_release命令在某些环境下可能不可用。然后分步骤给出两种解决方案,最后提醒用户谨慎操作。考虑到用户可能着急解决问题,步骤要尽量清晰明确。 相关问题设计要围绕这个错误的延伸场景:如何避免类似问题、替代命令、不同Python版本的处理等。这样如果用户遇到变体问题也能找到参考。</think>以下是针对 `pip install` 时出现 `subprocess.CalledProcessError: Command &#39;lsb_release -a&#39;` 错误的完整解决方案,结合引用内容整理: ### 错误原因 当执行 `pip install` 时,Python 的 `distro` 模块会尝试调用系统命令 `lsb_release -a` 获取 Linux 发行版信息。若该命令不存在、路径错误或权限不足(尤其在交叉编译/容器环境中),会触发此错误[^1][^3][^5]。 --- ### 解决方案 #### ✅ 首选方案:修改 `distro.py` 配置(安全可靠) 1. **定位 `distro.py` 文件** 执行以下命令查找文件路径: ```bash python -c "import pip._vendor.distro; print(pip._vendor.distro.__file__)" ``` 或尝试路径(Python 版本替换 `3.x`): ``` /usr/local/lib/python3.x/dist-packages/pip/_vendor/distro.py ``` 2. **修改源码** 用编辑器打开 `distro.py`,找到 `__init__` 方法(约第 550 行),修改参数默认值: ```python def __init__(self, include_lsb=True, ...): # 原始行 ``` 👇 修改为: ```python def __init__(self, include_lsb=False, ...): # 将 True 改为 False ``` 保存后重试安装命令即可[^3]。 #### ⚠️ 备选方案:临时移除 `lsb_release`(有风险) 若上述方法无效,可临时移除问题命令(**可能影响依赖此命令的其他程序**): ```bash sudo mv /usr/bin/lsb_release /usr/bin/lsb_release.bak # 备份而非删除 ``` 安装完成后再恢复: ```bash sudo mv /usr/bin/lsb_release.bak /usr/bin/lsb_release ``` > 注意:直接删除 (`rm`) 可能导致系统工具异常[^1][^2]。 --- ### 错误触发原理 ```mermaid graph LR A[pip install 包] --> B[调用 distro 模块] B --> C[尝试执行 lsb_release -a] C --> D{命令是否存在?} D -->|是| E[获取发行版信息] D -->|否或失败| F[抛出 CalledProcessError] ``` --- ### 预防建议 1. **容器环境**:基础镜像中安装 `lsb-release` 包: ```dockerfile RUN apt-get update && apt-get install -y lsb-release ``` 2. **权限问题**:避免使用 `sudo pip install`,优先用虚拟环境(`venv` 或 `conda`)[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘悦的技术分享

承您打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值