如何分配IP地址到Python中的接口?

我有python脚本,为我的无线和有线接口设置IP4地址。 到目前为止,我使用subprocess命令如:

 subprocess.call(["ip addr add local 192.168.1.2/24 broadcast 192.168.1.255 dev wlan0"]) 

我怎样才能使用python库设置接口的IP地址? 如果有什么办法可以使用python库获得已经存在的IPconfiguration?

Solutions Collecting From Web of "如何分配IP地址到Python中的接口?"

通过旧的ioctl界面设置一个地址:

 >>> import socket, struct, fcntl >>> >>> SIOCSIFADDR = 0x8916 >>> >>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) >>> >>> def setIpAddr(iface, ip): ... bin_ip = socket.inet_aton(ip) ... ifreq = struct.pack('16sH2s4s8s', iface, socket.AF_INET, '\x00'*2, bin_ip, '\x00'*8) ... fcntl.ioctl(sock, SIOCSIFADDR, ifreq) ... >>> setIpAddr('em1', '192.168.0.1') 

(使用SIOCSIFNETMASK = 0x891C设置网络掩码)

IP地址可以用相同的方式获取: 使用Python的stdlib查找本地IP地址

我相信有一个Netlink的python实现,如果你想使用它,而不是ioctl

用pyroute2 .IPRoute:

 from pyroute2 import IPRoute ip = IPRoute() index = ip.link_lookup(ifname='em1')[0] ip.addr('add', index, address='192.168.0.1', mask=24) ip.close() 

用pyroute2 .IPDB:

 from pyroute2 import IPDB ip = IPDB() with ip.interfaces.em1 as em1: em1.add_ip('192.168.0.1/24') ip.release() 

你有多个选项可以从你的python程序中完成。

你可以使用你所展示的ip工具。 虽然这不是最好的选择,但是这个工作有一点缓慢和尴尬的程序。

另一种方法是通过直接使用内核netlink接口来完成ip自己做的事情。 我知道libnl有一些实验(?)python绑定。 这可能工作,但你将不得不处理很多低级的东西。 我不会推荐这种简单的“设置和获取”ips的方式,但它是最“正确”和可靠的方式来做到这一点。

我认为最好的方法(如果你只想设置和获得ips)将使用NetworkManager的dbus接口。 虽然这是非常有限的,并可能有自己的问题(它可能不会像你想要的那样),如果NetworkManager正在运行,这是最直接的方法。

所以,如果你想让自己的手变脏,选择libnl方法,这显然是优越的,但也有更多的工作。 根据您的需要和一般的系统设置,您也可以脱离NetworkManager dbus接口。 否则,你可以这样离开它。