Python грешка во OpenVPN 3: поправете ја алатката, а не системскиот Python
Traceback го именува интерпретерот што извршил фронтенд, а не услугата што го поседува тунелот. Споредете ги двете пред да пренасочите нешто системски.
Traceback се појавува кога започнува команда за управување со VPN, а првиот инстинкт истрчува кон инсталирање друг Python или насочување на системското стандардно некаде на друго место. Тој инстинкт меша две извршни околини што немаат ништо заедничко. Едната му припаѓа на оперативниот систем и на неговите спакувани алатки; другата му припаѓа на кој и да е проект што го градите. Да се смени првата за да се задоволи втората е начинот на кој работна површина го губи управувачот со пакети.
Споредбата што вреди да се направи е помеѓу компонентата што навистина откажа и извршната околина што имате право да ја менувате. Тие речиси никогаш не се истиот објект.
Две Python прашања што изгледаат како едно
Првото прашање е: кој интерпретер ја изврши програмата што го испечати Traceback? Второто е: кој интерпретер треба да го користи мојот проект? Во терминал тие изгледаат идентично, бидејќи на двете се одговара со внесување python3, а имаат различни сопственици, различни патеки на надградба и различен радиус на влијание.
Системската алатка е врзана за интерпретерот со кој ја испорачала дистрибуцијата, заедно со компајлираните модули изградени за ABI на тој интерпретер. Проектот е врзан за која и да е околина што ја создавате за него. Преместувањето на системското стандардно ја менува првата за секоја алатка на машината одеднаш; создавањето околина ја менува втората за една папка.
Само едно од тие дејства може да се врати за една минута. Тоа не е првото.
Која компонента ја произведе грешката
Прочитајте ја првата линија од Traceback и извршната датотека што го произвела пред да прочитате нешто друго. Фронтендот на командната линија, привилегираната услуга и 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Првата линија на скриптата го именува интерпретерот што ќе го користи, и токму од тој интерпретер дојде Traceback. Барањето за пакетот ви кажува кому му припаѓа датотеката, што одлучува кој смее да ја менува. Статусот на услугата одговара на сосема друго прашање: дали работи привилегираниот бекенд што навистина отвора сесии.
Грешка при вчитување модул, одбивање на D-Bus активација и одбиени акредитиви се три различни фази. Грешката при вчитување се случува пред да постои која и да е сесија, така што ниту една количина VPN-конфигурација нема да ја поправи, а ниту работна услуга нема да ја поправи. Сместувањето на пораката во една од тие три фази е вистинскиот прв чекор.
Што може, а што не може да поправи проектната околина
Проектната околина решава проектен проблем: точните верзии на библиотеки што и требаат на една апликација, изолирани од сите други. Тоа е навистина корисно, и тоа е вистинската алатка кога програмата што откажува е ваша скрипта.
uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'Втората команда покажува која копија од врските може да ја види даден интерпретер, што е најбрзиот начин да се разликува пакет што недостасува од пакет што е засенет. Извршете ја со интерпретерот што го користи скриптата што откажува, а не со друг што случајно работи.
Она што проектната околина не може да го направи е да поправи фронтенд спакуван од дистрибуцијата. Зависностите на таа програма се изградени за интерпретерот што го избра управувачот со пакети, а нејзиното извршување во проектната околина или не успева, или создава смеса што никој не ја поддржува. Вбризгувањето патеки во неа со променлива на околината е истата грешка со дополнителни чекори: сте го смениле она што алатката го вчитува, но не и она против што е тестирана. Таа размена изгледа како поправка точно толку долго колку што е потребно да се стигне до следниот вчитување.
Зошто пренасочувањето на системски интерпретер е замка
Менувањето на стандардниот интерпретер е привлечно бидејќи изгледа дека ја поправа Traceback со една команда. Исто така ја крши претпоставката врз која е изградена секоја спакувана Python-алатка на домаќинот, а дефектите се појавуваат подоцна и на неповрзани места.
Механизмите за избор на алтернатива се дизајнирани да префрлаат меѓу еквивалентни имплементации, а не да инсталираат понов јазик под постари компајлирани модули. Компајлираните проширувања се градат за одреден ABI, па модул што се вчитал вчера денес може да не се вчита без ниту еден отстранет пакет.
Има и замка со именување во советите што ги наоѓаат луѓето. Командата python без верзија нема едно универзално значење низ дистрибуции и околини, а нејзиното третирање како фиксен синоним за одредено главно издание создава поправки што работат само на машината каде се напишани. Прочитајте ја политиката на системот пред вас, а не таа од блог-објавата.
Одделни тестови за прифаќање
На крајот припаѓаат два теста, а поминувањето на едниот не кажува ништо за другиот. Првиот е поддржаната клиентска команда да работи со интерпретерот за кој е спакувана. Вториот е привилегираната услуга да воспостави сесија и тунелот да пренесува сообраќај.
openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0Одржувајте независен пат до машината додека работите, особено ако VPN-от го носи вашиот единствен административен пристап. Промена на системски интерпретер е токму видот измена што може да го одземе тој пристап на половина пат.
Ако дефектот е модул што недостасува за системска алатка, поправката е операција со пакет преку поддржаниот работен тек. Ако дефектот е конфликт на верзии во вашиот сопствен проект, поправката е околина. Изборот помеѓу тие две е целата одлука, и таа се одредува од тоа која програма го испечати Traceback.