| # Python portpicker module | |
| [](https://badge.fury.io/py/portpicker) | |
|  | |
| [](https://travis-ci.org/google/python_portpicker) | |
| This module is useful for finding unused network ports on a host. If you need | |
| legacy Python 2 support, use the 1.3.x releases. | |
| This module provides a pure Python `pick_unused_port()` function. It can also be | |
| called via the command line for use in shell scripts. | |
| If your code can accept a bound TCP socket rather than a port number consider | |
| using `socket.bind(('localhost', 0))` to bind atomically to an available port | |
| rather than using this library at all. | |
| There is a race condition between picking a port and your application code | |
| binding to it. The use of a port server by all of your test code to avoid that | |
| problem is recommended on loaded test hosts running many tests at a time. | |
| Unless you are using a port server, subsequent calls to `pick_unused_port()` to | |
| obtain an additional port are not guaranteed to return a unique port. | |
| ### What is the optional port server? | |
| A port server is intended to be run as a daemon, for use by all processes | |
| running on the host. It coordinates uses of network ports by anything using a | |
| portpicker library. If you are using hosts as part of a test automation cluster, | |
| each one should run a port server as a daemon. You should set the | |
| `PORTSERVER_ADDRESS=@unittest-portserver` environment variable on all of your | |
| test runners so that portpicker makes use of it. | |
| A sample port server is included. This portserver implementation works but has | |
| not spent time in production. If you use it with good results please report back | |
| so that this statement can be updated to reflect that. :) | |
| A port server listens on a unix socket, reads a pid from a new connection, tests | |
| the ports it is managing and replies with a port assignment port for that pid. A | |
| port is only reclaimed for potential reassignment to another process after the | |
| process it was originally assigned to has died. Processes that need multiple | |
| ports can simply issue multiple requests and are guaranteed they will each be | |
| unique. | |
| ## Typical usage: | |
| ```python | |
| import portpicker | |
| test_port = portpicker.pick_unused_port() | |
| ``` | |
| Or from the command line: | |
| ```bash | |
| TEST_PORT=`/path/to/portpicker.py $$` | |
| ``` | |
| Or, if portpicker is installed as a library on the system Python interpreter: | |
| ```bash | |
| TEST_PORT=`python3 -m portpicker $$` | |
| ``` | |
| ## DISCLAIMER | |
| This is not an official Google product (experimental or otherwise), it is just | |
| code that happens to be owned by Google. |