Трассировка появляется, когда запускается команда управления VPN, и первый порыв ведёт к установке другого Python или к перенаправлению системного значения по умолчанию куда-то ещё. Этот порыв смешивает две среды выполнения, не имеющие друг к другу никакого отношения. Одна принадлежит операционной системе и её упакованным инструментам; другая принадлежит любому проекту, который вы создаёте. Заменить первую, чтобы удовлетворить вторую, — так работающий рабочий стол теряет свой менеджер пакетов.

Сравнение, которое стоит провести, — между компонентом, который действительно отказал, и средой выполнения, которую вы вправе изменить. Это почти никогда не один и тот же объект.

Два вопроса о Python, которые выглядят как один

Первый вопрос: какой интерпретатор запустил программу, напечатавшую трассировку? Второй: какой интерпретатор должен использовать мой проект? В терминале они выглядят одинаково, потому что на оба отвечают, набирая python3, а владельцы, пути обновления и радиус поражения у них разные.

Системный инструмент привязан к интерпретатору, с которым его поставил дистрибутив, вместе со скомпилированными модулями, собранными под ABI этого интерпретатора. Проект привязан к любой среде, которую вы для него создадите. Перемещение системного значения по умолчанию меняет первое сразу для всех инструментов на машине; создание среды меняет второе для одного каталога.

Отменить за минуту можно только одно из этих действий. Это не первое.

Какой компонент породил ошибку

Прежде чем читать что-либо ещё, прочитайте первую строку трассировки и исполняемый файл, который её породил. Фронтенд командной строки, привилегированная служба и привязки API — отдельные части, и Python из них только некоторые.

command -v openvpn3
head -n 1 "$(command -v openvpn3)"
dpkg -S "$(command -v openvpn3)" 2>/dev/null
systemctl status openvpn3-service-client --no-pager

Первая строка скрипта называет интерпретатор, который он будет использовать, и именно от этого интерпретатора пришла трассировка. Запрос к пакету говорит, кому принадлежит файл, а это определяет, кому разрешено его менять. Состояние службы отвечает на совсем другой вопрос: работает ли привилегированный бэкенд, который действительно устанавливает сессии.

Ошибка импорта модуля, отказ активации D-Bus и отвергнутые учётные данные — три разные стадии. Ошибка импорта случается до того, как появится хоть какая-то сессия, поэтому никакая настройка VPN её не исправит, и работающая служба тоже не исправит. Отнести сообщение к одной из этих трёх стадий — и есть настоящий первый шаг.

Что среда проекта может и чего не может исправить

Среда проекта решает задачу проекта: точные версии библиотек, нужные одному приложению, изолированные от всего остального. Это действительно полезно, и это правильный инструмент, когда сбоящая программа — ваш собственный скрипт.

uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'

Вторая команда показывает, какую копию привязок видит данный интерпретатор, и это самый быстрый способ отличить отсутствующий пакет от перекрытого. Запускайте её тем интерпретатором, который использует сбоящий скрипт, а не другим, который случайно работает.

Чего среда проекта не может — починить фронтенд, упакованный дистрибутивом. Зависимости этой программы собраны под интерпретатор, выбранный менеджером пакетов, и её запуск внутри среды вашего проекта либо терпит неудачу, либо даёт смесь, которую никто не поддерживает. Внедрять в неё пути через переменную среды — та же ошибка с лишними шагами: вы изменили то, что загружает инструмент, не изменив то, против чего он проверялся. Этот обмен выглядит исправлением ровно до следующего импорта.

Почему перенаправление системного интерпретатора — ловушка

Менять интерпретатор по умолчанию заманчиво, потому что кажется, будто одна команда исправляет трассировку. Это ещё и ломает допущение, на котором построен каждый упакованный Python-инструмент на хосте, а сбои проявляются позже и в несвязанных местах.

Механизмы выбора альтернатив создавались для переключения между равнозначными реализациями, а не для установки более нового языка под более старые скомпилированные модули. Скомпилированные расширения собираются под конкретный ABI, поэтому модуль, импортировавшийся вчера, сегодня может не загрузиться без единого удалённого пакета.

В советах, которые находят люди, есть и ловушка с именем. Команда python без версии не имеет единого универсального значения в разных дистрибутивах и средах, а обращение с ней как с фиксированным синонимом конкретной основной версии даёт исправления, работающие только на той машине, где их написали. Читайте политику системы перед вами, а не ту, что в статье блога.

Отдельные приёмочные проверки

В конце уместны две проверки, и прохождение одной ничего не говорит о другой. Первая — поддерживаемая клиентская команда работает с интерпретатором, под который она упакована. Вторая — привилегированная служба устанавливает сессию, а туннель несёт трафик.

openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0

Сохраняйте независимый путь на машину, пока работаете, особенно если VPN несёт ваш единственный административный доступ. Изменение системного интерпретатора — ровно та правка, которая может отнять этот доступ на полпути.

Если сбой — отсутствующий модуль для системного инструмента, исправление это операция с пакетом через поддерживаемый рабочий процесс. Если сбой — конфликт версий в вашем собственном проекте, исправление это среда. Выбор между этими двумя и есть всё решение, и его определяет то, какая программа напечатала трассировку.

Похожие статьи