Welcome, guest | Sign In | My Account | Store | Cart

Notice! PyPM is being replaced with the ActiveState Platform, which enhances PyPM’s build and deploy capabilities. Create your free Platform account to download ActivePython or customize Python with the packages you require and get automatic updates.

Download
ActivePython
INSTALL>
pypm install ipy

How to install IPy

  1. Download and install ActivePython
  2. Open Command Prompt
  3. Type pypm install ipy
 Python 2.7Python 3.2Python 3.3
Windows (32-bit)
0.81 Available View build log
0.75 Available View build log
0.74 Available View build log
0.73 Available View build log
0.72 Available View build log
0.71 Available View build log
0.70 Available View build log
0.75
0.81Never BuiltWhy not?
0.75 Available View build log
0.74 Available View build log
0.73 Available View build log
Windows (64-bit)
0.81 Available View build log
0.75 Available View build log
0.74 Available View build log
0.73 Available View build log
0.72 Available View build log
0.71 Available View build log
0.70 Available View build log
0.75
0.81Never BuiltWhy not?
0.75 Available View build log
0.74 Available View build log
0.73 Available View build log
Mac OS X (10.5+)
0.81 Available View build log
0.75 Available View build log
0.74 Available View build log
0.73 Available View build log
0.72 Available View build log
0.71 Available View build log
0.70 Available View build log
0.75
0.81Never BuiltWhy not?
0.75 Available View build log
0.74 Available View build log
0.73 Available View build log
Linux (32-bit)
0.81 Available View build log
0.75 Available View build log
0.74 Available View build log
0.73 Available View build log
0.72 Available View build log
0.71 Available View build log
0.70 Available View build log
0.75
0.81Never BuiltWhy not?
0.75 Available View build log
0.74 Available View build log
0.73 Available View build log
Linux (64-bit)
0.81 Available View build log
0.75 Available View build log
0.74 Available View build log
0.73 Available View build log
0.72 Available View build log
0.71 Available View build log
0.70 Available View build log
0.75
0.81Never BuiltWhy not?
0.75 Available View build log
0.74 Available View build log
0.73 Available View build log
0.81 Available View build log
 
Author
License
BSD License
Imports
Lastest release
version 0.81 on Apr 11th, 2013

IPy - class and tools for handling of IPv4 and IPv6 addresses and networks.

Website: https://github.com/haypo/python-ipy/

Presentation of the API

The IP class allows a comfortable parsing and handling for most notations in use for IPv4 and IPv6 addresses and networks. It was greatly inspired by RIPE's Perl module NET::IP's interface but doesn't share the implementation. It doesn't share non-CIDR netmasks, so funky stuff like a netmask of 0xffffff0f can't be done here.

>>> from IPy import IP
>>> ip = IP('127.0.0.0/30')
>>> for x in ip:
...  print(x)
...
127.0.0.0
127.0.0.1
127.0.0.2
127.0.0.3
>>> ip2 = IP('0x7f000000/30')
>>> ip == ip2
1
>>> ip.reverseNames()
['0.0.0.127.in-addr.arpa.', '1.0.0.127.in-addr.arpa.', '2.0.0.127.in-addr.arpa.', '3.0.0.127.in-addr.arpa.']
>>> ip.reverseName()
'0-3.0.0.127.in-addr.arpa.'
>>> ip.iptype()
'PRIVATE'

Supports most IP address formats

It can detect about a dozen different ways of expressing IP addresses and networks, parse them and distinguish between IPv4 and IPv6 addresses:

>>> IP('10.0.0.0/8').version()
4
>>> IP('::1').version()
6
IPv4 addresses
>>> print(IP(0x7f000001))
127.0.0.1
>>> print(IP('0x7f000001'))
127.0.0.1
>>> print(IP('127.0.0.1'))
127.0.0.1
>>> print(IP('10'))
10.0.0.0
IPv6 addresses
>>> print(IP('1080:0:0:0:8:800:200C:417A'))
1080::8:800:200c:417a
>>> print(IP('1080::8:800:200C:417A'))
1080::8:800:200c:417a
>>> print(IP('::1'))
::1
>>> print(IP('::13.1.68.3'))
::d01:4403
Network mask and prefixes
>>> print(IP('127.0.0.0/8'))
127.0.0.0/8
>>> print(IP('127.0.0.0/255.0.0.0'))
127.0.0.0/8
>>> print(IP('127.0.0.0-127.255.255.255'))
127.0.0.0/8

Derive network address

IPy can transform an IP address into a network address by applying the given netmask: >>> print(IP('127.0.0.1/255.0.0.0', make_net=True)) 127.0.0.0/8

This can also be done for existing IP instances: >>> print(IP('127.0.0.1').make_net('255.0.0.0')) 127.0.0.0/8

Convert address to string

Nearly all class methods which return a string have an optional parameter 'wantprefixlen' which controls if the prefixlen or netmask is printed. Per default the prefilen is always shown if the network contains more than one address:

wantprefixlen == 0 / None     don't return anything   1.2.3.0
wantprefixlen == 1            /prefix                 1.2.3.0/24
wantprefixlen == 2            /netmask                1.2.3.0/255.255.255.0
wantprefixlen == 3            -lastip                 1.2.3.0-1.2.3.255

You can also change the defaults on an per-object basis by fiddling with the class members:

  • NoPrefixForSingleIp
  • WantPrefixLen

Examples of string conversions:

>>> IP('10.0.0.0/32').strNormal()
'10.0.0.0'
>>> IP('10.0.0.0/24').strNormal()
'10.0.0.0/24'
>>> IP('10.0.0.0/24').strNormal(0)
'10.0.0.0'
>>> IP('10.0.0.0/24').strNormal(1)
'10.0.0.0/24'
>>> IP('10.0.0.0/24').strNormal(2)
'10.0.0.0/255.255.255.0'
>>> IP('10.0.0.0/24').strNormal(3)
'10.0.0.0-10.0.0.255'
>>> ip = IP('10.0.0.0')
>>> print(ip)
10.0.0.0
>>> ip.NoPrefixForSingleIp = None
>>> print(ip)
10.0.0.0/32
>>> ip.WantPrefixLen = 3
>>> print(ip)
10.0.0.0-10.0.0.0

Work with multiple networks

Simple addition of neighboring netblocks that can be aggregated will yield a parent network of both, but more complex range mapping and aggregation requires is available with the IPSet class which will hold any number of unique address ranges and will aggregate overlapping ranges.

>>> from IPy import IP, IPSet
>>> IP('10.0.0.0/22') - IP('10.0.2.0/24')
IPSet([IP('10.0.0.0/23'), IP('10.0.3.0/24')])
>>> IPSet([IP('10.0.0.0/23'), IP('10.0.3.0/24'), IP('10.0.2.0/24')])
IPSet([IP('10.0.0.0/22')])
>>> s = IPSet([IP('10.0.0.0/22')])
>>> s.add(IP('192.168.1.0/29'))
>>> s
IPSet([IP('10.0.0.0/22'), IP('192.168.1.0/29')])
>>> s.discard(IP('192.168.1.2'))
>>> s
IPSet([IP('10.0.0.0/22'), IP('192.168.1.0/31'), IP('192.168.1.3'), IP('192.168.1.4/30')])

What's new

Version 0.81 (2013-04-08)
  • Correct reverseName() for IPv6 addresses, so IP('::1').reverseName() returns correct.
  • Add network mask awareness to v46map()
  • Fix Python 3 errors in IPSet class
  • Make IPSet base class be object when MutableSet isn't available, fixing errors in Python 2.5
Version 0.80 (2013-03-26)

System Message: WARNING/2 (<string>, line 178)

Title underline too short.

Version 0.80 (2013-03-26)
------------
  • Drop support of Python older than 2.4
  • Python 3 does not need 2to3 conversion anymore (same code base)
  • Fix adding of non-adjacent networks: 192.168.0.0/24 + 192.168.255.0/24 made 192.168.0.0/23
  • Fix adding networks that don't create a valid subnet: 192.168.1.0/24 + 192.168.2.0/24 made 192.168.1.0/23
  • Fix adding with an IPv6 address where .int() was < 32 bits made IPy believe it

System Message: WARNING/2 (<string>, line 187)

Bullet list ends without a blank line; unexpected unindent.
was an IPv4 address: ::ffff:0/112 + ::1:0:0/112 made 255.255.0.0/111

System Message: WARNING/2 (<string>, line 189)

Block quote ends without a blank line; unexpected unindent.
  • Add support of IPSets
  • Add support for subtracting a network range
  • Prevent IPv4 and IPv6 ranges from saying they contain each other
  • Add a .v46map() method to convert mapped address ranges such as IP('::ffff:192.168.1.1'); RFC 4291
  • Change sort order to more natural: IPv4 before IPv6; less-specific prefixes first (/0 before /32)
Version 0.76 (2013-03-19)
  • ip == other and ip != other doesn't fail with an exception anymore if other

System Message: WARNING/2 (<string>, line 202)

Bullet list ends without a blank line; unexpected unindent.
is not a IP object

System Message: WARNING/2 (<string>, line 203)

Block quote ends without a blank line; unexpected unindent.
  • Add IP.get_mac() method: get the 802.3 MAC address from IPv6 RFC 2464

System Message: WARNING/2 (<string>, line 204)

Bullet list ends without a blank line; unexpected unindent.
address.

System Message: WARNING/2 (<string>, line 205)

Block quote ends without a blank line; unexpected unindent.
  • Fix IP('::/0')[0]: return an IPv6 instead of an IPv4 address
Version 0.75 (2011-04-12)
  • IP('::/0').netmask() gives IP('::') instead of IP('0.0.0.0')
Version 0.74 (2011-02-16)
  • Fix tests for Python 3.1 and 3.2
  • ip.__nonzero__() and (ipa in ipb) return a bool instead of 0 or 1
  • IP('0.0.0.0/0') + IP('0.0.0.0/0') raises an error, fix written by Arfrever
Version 0.73 (2011-02-15)
  • Support Python 3: setup.py runs 2to3
  • Update the ranges for IPv6 IPs
  • Fix reverseName() and reverseNames() for IPv4 in IPv6 addresses
  • Drop support of Python < 2.5
Version 0.72 (2010-11-23)
  • Include examples and MANIFEST.in in source build (add them to MANIFEST.in)
  • Remove __rcsid__ constant from IPy module
Version 0.71 (2010-10-01)
  • Use xrange() instead of range()
  • Use isinstance(x, int) instead of type(x) == types.IntType
  • Prepare support of Python3 (use integer division: x // y)
  • Fix IP(long) constructor: ensure that the address is not too large
  • Constructor raise a TypeError if the type is not int, long, str or unicode
  • 223.0.0.0/8 is now public (belongs to APNIC)
Version 0.70 (2009-10-29)
  • New "major" version because it may break compatibility
  • Fix __cmp__(): IP('0.0.0.0/0') and IP('0.0.0.0') are not equal
  • Fix IP.net() of the network "::/0": "::" instead of "0.0.0.0". IPy 0.63 should fix this bug, but it wasn't.
Version 0.64 (2009-08-19)
  • Create MANIFEST.in to fix setup.py bdist_rpm, fix by Robert Nickel
Version 0.63 (2009-06-23)
  • Fix formatting of "IPv4 in IPv6" network, eg. IP('::ffff:192.168.10.0/120'), the netmask ("/120" in the example) was missing!
Version 0.62 (2008-07-15)
  • Fix reverse DNS of IPv6 address: use ".ip6.arpa." suffix instead of deprecated ".ip6.int." suffix
Version 0.61 (2008-06-12)
  • Patch from Aras Vaichas allowing the [-1] operator to work with an IP object of size 1.
Version 0.60 (2008-05-16)
  • strCompressed() formats '::ffff:a.b.c.d' correctly
  • Use strCompressed() instead of strFullsize() to format IP addresses, ouput is smarter with IPv6 address
  • Remove check_addr_prefixlen because it generates invalid IP address

Subscribe to package updates

Last updated Apr 11th, 2013

Download Stats

Last month:10

What does the lock icon mean?

Builds marked with a lock icon are only available via PyPM to users with a current ActivePython Business Edition subscription.

Need custom builds or support?

ActivePython Enterprise Edition guarantees priority access to technical support, indemnification, expert consulting and quality-assured language builds.

Plan on re-distributing ActivePython?

Get re-distribution rights and eliminate legal risks with ActivePython OEM Edition.