Python中如何生成IP地址?

from IPy import IP IP('172.10.250-254.250-254') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/site-packages/IPy.py", line 242, in init raise ValueError("only one '-' allowed in IP Address") ValueError: only one '-' allowed in IP Address</module></stdin>

IPy 好像不支持这种生成方式,Python 有哪些库可以解决这个问题么?


Python中如何生成IP地址?

14 回复

排个版


生成IP地址通常有两种需求:生成单个随机IP或生成指定范围内的IP列表。

1. 生成单个随机IP地址:

import random
import ipaddress

def generate_random_ip():
    # 生成随机的IPv4地址
    return str(ipaddress.IPv4Address(random.randint(0, 2**32 - 1)))

# 使用示例
print(generate_random_ip())  # 输出类似:192.168.1.1

2. 生成IP地址范围:

import ipaddress

def generate_ip_range(start_ip, end_ip):
    start = int(ipaddress.IPv4Address(start_ip))
    end = int(ipaddress.IPv4Address(end_ip))
    return [str(ipaddress.IPv4Address(ip)) for ip in range(start, end + 1)]

# 使用示例
ip_list = generate_ip_range('192.168.1.1', '192.168.1.5')
print(ip_list)  # 输出:['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5']

3. 生成CIDR格式的所有IP:

def generate_cidr_ips(cidr):
    network = ipaddress.ip_network(cidr, strict=False)
    return [str(ip) for ip in network.hosts()]  # hosts()排除网络地址和广播地址

# 使用示例
ips = generate_cidr_ips('192.168.1.0/29')
print(ips)  # 输出该网段所有可用主机IP

关键点:

  • 使用Python内置的ipaddress库处理IP地址最规范
  • 生成随机IP时注意避免生成保留地址
  • 处理大范围IP时考虑内存使用

建议直接使用ipaddress库处理IP相关操作。

IP 段不连续,不符合规范,唯有用 random 库手撸

ValueError: only one ‘-’ allowed in IP Address



emmmmm 是这样的
我要按输入的语句生成 ip 地址,只是拿 IPy 举了个栗子
比如说我输入
172.10.100-101.1-3
生成
172.10.100.1
172.10.100.2
172.10.100.3
172.10.101.1
172.10.101.2
172.10.101.3
------------------------
撸了一中午 还没写出来

我现在的想法是:
把输入的字符串 split(’.’)分割
把分割出的 list 循环读取出来
读取出来的内容用 split(’-’)分割
------
上面这些都写出来了
但是组合方法我实在是写不出来了 没有头绪

不要老想着这是一个 IP 地址,就结束了:
lambda x: ["%d.%d.%d.%d"%d for d in itertools.product([range(m,n+1) for s in x.split(".") for m,n,_ in [map(int, (s+"-"+s).split("-"))]])]

#5 看起来需要重练基本功……

emmm 谢了大佬

手动委屈.gif

https://docs.python.org/3/library/ipaddress.html#ip-network-definitions
Python3 标准库 ipaddress 可以处理 IP 网段,考虑用 CIDR 格式划分子网?

基本功太差

随手写了一个,没考虑效率方面的问题:
def create_ip_address(one, two, three, four):
int_list = []
for i in one, two, three, four:
if isinstance(i, int):
i = [i]
i_len = len(i)
if i_len == 1:
int_list.append(i)
elif i_len == 2:
int_list.append(range(i[0], i[1]+1))
else:
raise ValueError(‘元组内只能有 1~2 个数字’)
ip_list = []
for s in int_list:
s_list = [str(w) for w in s]
if not ip_list:
ip_list = s_list
else:
ip_list = [’.’.join([o, p]) for p in s_list for o in ip_list]
return ip_list


if name == ‘main’:
test_create = create_ip_address(1, (3, 50), (5, 6), (7, 8))
print(len(test_create), test_create)

图: https://s1.ax1x.com/2018/10/20/i01I00.jpg
注:也没考虑捣乱的情况

回到顶部