port-for is a command-line utility and a python library that helps with local TCP ports management.
It can find an unused TCP localhost port and remember the association:
$ sudo port-for foo 37987
This can be useful when you are installing a stack of software with multiple parts needing port numbers.
There are several rules port-for is trying to follow to find and return a new unused port:
Port must be unused: port-for checks this by trying to connect to the port and to bind to it.
Port must be IANA unassigned and otherwise not well-known: this is acheived by maintaining unassigned ports list (parsed from IANA and Wikipedia).
Port shouldn’t be inside ephemeral port range. This is important because ports from ephemeral port range can be assigned temporary by OS (e.g. by machine’s IP stack) and this may prevent service restart in some circumstances. port-for doesn’t return ports from ephemeral port ranges configured at the current machine.
Other heuristics are also applied: port-for tries to return a port from larger port ranges; it also doesn’t return ports that are too close to well-known ports.
Installation
System-wide using easy_install (something like python-setuptools should be installed):
sudo pip install port-for
or:
sudo easy_install port-for
or inside a virtualenv:
pip install port-for
Script usage
port-for <foo> script finds an unused port and associates it with <foo>. Subsequent calls return the same port number.
This utility doesn’t actually bind the port or otherwise prevents the port from being taken by another software. It tries to select a port that is less likely to be used by another software (and that is unused at the time of calling of course). Utility also makes sure that port-for bar won’t return the same port as port-for foo on the same machine.
$ sudo port-for foo 37987 $ port-for foo 37987
You may want to develop some naming conventions (e.g. prefix your app names) in order to enable multiple sites on the same server:
$ sudo port-for example.com/apache 35456
Please note that port-for script requires read and write access to /etc/port-for.conf. This usually means regular users can read port values but sudo is required to associate a new port.
List all associated ports:
$ port-for --list foo: 37987 example.com/apache: 35456
Remove an association:
$ sudo port-for --unbind foo $ port-for --list example.com/apache: 35456
Library usage
>>> import port_for
>>> port_for.select_random()
37774
>>> port_for.select_random()
48324
>>> 80 in port_for.available_good_ports()
False
>>> port_for.get_port()
34455
>>> port_for.get_port("1234")
1234
>>> port_for.get_port((2000, 3000))
2345
>>> port_for.get_port({4001, 4003, 4005})
4005
>>> port_for.get_port([{4000, 4001}, (4100, 4200)])
4111
Dig into source code for more.
Contributing
Development happens at github: https://github.com/fizyk/port-for/
Issue tracker: https://github.com/fizyk/port-for/issues/new
Release files for port-for 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| port_for-1.1.0.tar.gz | 17.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| port_for-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 34.5 kB
Release files / port_for-1.1.0.tar.gz
| Download URL | port_for-1.1.0.tar.gz |
|---|---|
| Size | 17.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b9e949f0ec7101094c4b0f096fad80d0aa90818854fa69a9d750fa4fd1e7b4ba
|
|
BLAKE2b-256 checksum How to use checksums |
85dbcb50b1dd5ce6d1ffdfb93ff358c714c57367cc59beafe14209c21c0b3408
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.
Transparency logRelease files / port_for-1.1.0-py3-none-any.whl
| Download URL | port_for-1.1.0-py3-none-any.whl |
|---|---|
| Size | 17.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
99c543583dc33942b64ae5e3b80d71c536bd2eb1c568730d533776e0d0ff9264
|
|
BLAKE2b-256 checksum How to use checksums |
5c8b823aec43117b17fcecd241b3c893c4e6f9156a878b139b2d684d71fe25f7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.
Transparency log