Ping3

Ping3 is a pure python3 version of ICMP ping implementation using raw socket.
(Note that on some platforms, ICMP messages can only be sent from processes running as root.)
The Python2 version originally from here.
This version maintained at this github repo.
CHANGELOG
Get Started
- If you met "permission denied", you may need to run this as root. Alternatively see this for troubleshooting on linux.
pip install ping3
>>> from ping3 import ping, verbose_ping
>>> ping('example.com')
0.215697261510079666
>>> verbose_ping('example.com')
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
$ ping3 example.com
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
Installation
pip install ping3
pip install --upgrade ping3
pip uninstall ping3
Functions
>>> from ping3 import ping, verbose_ping
>>> ping('example.com')
0.215697261510079666
>>> ping('not.exist.com')
False
>>> ping("224.0.0.0")
None
>>> ping('example.com', timeout=10)
0.215697261510079666
>>> ping('example.com', unit='ms')
215.9627876281738
>>> ping('example.com', src_addr='192.168.1.15')
0.215697261510079666
>>> ping('example.com', interface='eth0')
0.215697261510079666
>>> ping('example.com', ttl=5)
None
>>> ping('example.com', size=56)
0.215697261510079666
>>> verbose_ping('example.com')
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
>>> verbose_ping('example.com', timeout=10)
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
>>> verbose_ping('example.com', count=6)
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
>>> verbose_ping('example.com', count=0)
ping 'example.com' ... 215ms
...
>>> verbose_ping('example.com', src_addr='192.168.1.15')
ping 'example.com' from '192.168.1.15' ... 215ms
ping 'example.com' from '192.168.1.15' ... 216ms
ping 'example.com' from '192.168.1.15' ... 219ms
ping 'example.com' from '192.168.1.15' ... 217ms
>>> verbose_ping('example.com', interface='wifi0')
ping 'example.com' from '192.168.1.15' ... 215ms
ping 'example.com' from '192.168.1.15' ... 216ms
ping 'example.com' from '192.168.1.15' ... 219ms
ping 'example.com' from '192.168.1.15' ... 217ms
>>> verbose_ping('example.com', unit='s')
ping 'example.com' ... 1s
ping 'example.com' ... 2s
ping 'example.com' ... 1s
ping 'example.com' ... 1s
>>> verbose_ping('example.com', ttl=5)
ping 'example.com' ... Timeout
ping 'example.com' ... Timeout
ping 'example.com' ... Timeout
ping 'example.com' ... Timeout
>>> verbose_ping('example.com', interval=5)
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
>>> verbose_ping('example.com', size=56)
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
DEBUG mode
Show more info for developers.
>>> import ping3
>>> ping3.DEBUG = True
>>> ping3.ping("example.com")
[DEBUG] IP HEADER: {'version': 69, 'tos': 0, 'len': 14336, 'id': 8620, 'flags': 0, 'ttl': 51, 'protocol': 1, 'checksum': *, 'src_addr': *, 'dest_addr': *}
[DEBUG] ICMP HEADER: {'type': 0, 'code': 0, 'checksum': 8890, 'id': 21952, 'seq': 0}
0.215697261510079666
>>> ping3.ping("example.com", timeout=0.0001)
[DEBUG] Request timeout for ICMP packet. (Timeout = 0.0001s)
None
>>> ping3.ping("not.exist.com")
[DEBUG] Cannot resolve: Unknown host. (Host = not.exist.com)
False
>>> ping3.ping("example.com", ttl=1)
[DEBUG] Time exceeded: Time To Live expired.
None
EXCEPTIONS mode
Raise exceptions when there are errors instead of return None
>>> import ping3
>>> ping3.EXCEPTIONS = True
>>> ping3.ping("example.com", timeout=0.0001)
[... Traceback ...]
ping3.errors.Timeout: Request timeout for ICMP packet. (Timeout = 0.0001s)
>>> ping3.ping("not.exist.com")
[... Traceback ...]
ping3.errors.HostUnknown: Cannot resolve: Unknown host. (Host = not.exist.com)
>>> ping3.ping("example.com", ttl=1)
[... Traceback ...]
ping3.errors.TimeToLiveExpired: Time exceeded: Time To Live expired.
>>> try:
>>> ping3.ping("example.com", ttl=1)
>>> except ping3.errors.TimeToLiveExpired as err:
>>> print(err.ip_header["src_addr"])
1.2.3.4
>>> help(ping3.errors)
import ping3
ping3.EXCEPTIONS = True
try:
ping3.ping("not.exist.com")
except ping3.errors.HostUnknown:
print("Host unknown error raised.")
except ping3.errors.PingError:
print("A ping error raised.")
Command Line Execution
Execute ping3 from command-line.
Note: On some platforms, ping3
needs root privilege to send/receive packets. You may want to use sudo ping3
.
$ ping3 --help
$ python -m ping3 --help
$ ping3 --version
3.0.0
$ ping3 example.com
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
$ ping3 example.com 8.8.8.8
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
ping '8.8.8.8' ... 5ms
ping '8.8.8.8' ... 2ms
ping '8.8.8.8' ... 6ms
ping '8.8.8.8' ... 5ms
$ ping3 --count 1 example.com
ping 'example.com' ... 215ms
$ ping3 --count 0 example.com
ping 'example.com' ... 215ms
...
$ ping3 --timeout 10 example.com
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
$ ping3 --ttl 5 example.com
ping 'example.com' ... Timeout
ping 'example.com' ... Timeout
ping 'example.com' ... Timeout
ping 'example.com' ... Timeout
$ ping3 --size 56 example.com
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
$ ping3 --interval 5 example.com
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
$ ping3 --interface eth0 example.com
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
$ ping3 --src 192.168.1.15 example.com
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms
$ ping3 --exceptions --timeout 0.001 example.com
[... Traceback ...]
ping3.errors.Timeout: Request timeout for ICMP packet. (Timeout = 0.0001s)
$ ping3 --debug --timeout 0.001 example.com
[DEBUG] Request timeout for ICMP packet. (Timeout = 0.001s)
ping 'example.com' ... Timeout > 0.001s
[DEBUG] Request timeout for ICMP packet. (Timeout = 0.001s)
ping 'example.com' ... Timeout > 0.001s
[DEBUG] Request timeout for ICMP packet. (Timeout = 0.001s)
ping 'example.com' ... Timeout > 0.001s
[DEBUG] Request timeout for ICMP packet. (Timeout = 0.001s)
ping 'example.com' ... Timeout > 0.001s