Я фактически использую следующее в одной из моих программ:
port = random.randint(10000,60000)
Конечно, это даже более склонно к коллизиям, чем ваш код. Но у меня никогда не было проблем с этим. Дело в том, что в любой момент времени большинство из этих портов с высокими номерами не используются, и если вы просто выберете один случайным образом, конфликт с другим процессом маловероятен. Если вы делаете что-то наподобие решения, которое вы опубликовали в своем ответе (открывая сокет и захватывая номер его порта), почти наверняка порт не будет конфликтовать. Поэтому, если это то, что вы будете использовать только для себя (в отличие от того, что вы собираетесь опубликовать для публики), подумайте, стоит ли придумывать действительно пуленепробиваемое решение. Скорее всего, это никогда не изменится.
По мотивам комментария Марсело Кантоса по вашему вопросу я добавлю, что стандартное решение в подобных случаях заключается в том, чтобы процесс, использующий порт, привязывался к нему, а затем передавал эту информацию любой другой программе, которая в этом нуждается , Как правило, это будет что-то вроде записи временного файла, содержащего номер порта, в какое-то стандартное место в файловой системе. Поскольку процесс, с которым вы работаете, этого не делает, в каком-то смысле любое решение, которое вы придумали, будет чем-то вроде хака. Но опять же, если это только для вашего собственного использования, это, вероятно, хорошо.