Traceback се појављује када почне команда за управљање VPN-ом, а први порив јури ка инсталацији другог Pythona или ка преусмеравању системског подразумеваног негде другде. Тај порив меша два извршна окружења која немају ништа једно с другим. Једно припада оперативном систему и његовим запакованим алатима; друго припада било ком пројекту који градите. Променити прво да би се задовољило друго јесте начин на који радна површина која функционише изгуби свог менаџера пакета.

Поређење које вреди направити је између компоненте која је заиста отказала и извршног окружења које смете да мењате. Они скоро никада нису исти објекат.

Два 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.

Повезани чланци