Traceback se pojavljuje kada počne komanda za upravljanje VPN-om, a prvi poriv juri ka instalaciji drugog Pythona ili ka preusmeravanju sistemskog podrazumevanog negde drugde. Taj poriv meša dva izvršna okruženja koja nemaju ništa jedno s drugim. Jedno pripada operativnom sistemu i njegovim zapakovanim alatima; drugo pripada bilo kom projektu koji gradite. Promeniti prvo da bi se zadovoljilo drugo jeste način na koji radna površina koja funkcioniše izgubi svoj menadžer paketa.

Poređenje koje vredi napraviti je između komponente koja je zaista otkazala i izvršnog okruženja koje smete da menjate. Oni skoro nikada nisu isti objekat.

Dva Python pitanja koja izgledaju kao jedno

Prvo pitanje je: koji interpreter je pokrenuo program koji je štampao traceback? Drugo je: koji interpreter moj projekat treba da koristi? U terminalu izgledaju identično, jer se na oba odgovara kucanjem python3, a imaju različite vlasnike, različite puteve nadogradnje i različit radijus dejstva.

Sistemski alat je vezan za interpreter sa kojim ga je distribucija isporučila, zajedno sa kompajliranim modulima izgrađenim za ABI tog interpretera. Projekat je vezan za bilo koje okruženje koje napravite za njega. Pomeranje sistemskog podrazumevanog menja prvo za svaki alat na mašini odjednom; pravljenje okruženja menja drugo za jedan direktorijum.

Samo se jedna od tih radnji može poništiti za minut. To nije prva.

Koja komponenta je proizvela grešku

Pročitajte prvu liniju traceback-a i izvršnu datoteku koja ga je proizvela pre nego što pročitate bilo šta drugo. Frontend komandne linije, privilegovani servis i API veze su odvojeni delovi, i samo su neki od njih uopšte 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

Prva linija skripte imenuje interpreter koji će koristiti, i upravo iz tog interpretera je došao traceback. Upit o paketu vam kaže čiji je fajl, što određuje ko sme da ga menja. Status servisa odgovara na sasvim drugo pitanje: da li radi privilegovani backend koji zaista uspostavlja sesije.

Greška pri uvozu modula, odbijanje D-Bus aktivacije i odbijeni akreditiv su tri različite faze. Greška pri uvozu se dešava pre nego što postoji bilo kakva sesija, pa je nikakva količina VPN konfiguracije neće popraviti, a ni servis koji radi je neće popraviti. Svrštavanje poruke u jednu od te tri faze je pravi prvi korak.

Šta okruženje projekta može, a šta ne može da popravi

Okruženje projekta rešava problem projekta: tačne verzije biblioteka koje su potrebne jednoj aplikaciji, izolovane od svega ostalog. To je zaista korisno, i to je pravi alat kada je program koji otkazuje vaša sopstvena skripta.

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

Druga komanda pokazuje koju kopiju veza vidi dati interpreter, i to je najbrži način da se razlikuje paket koji nedostaje od paketa koji je zasenčen. Pokrenite je interpreterom koji koristi skripta koja otkazuje, a ne drugim koji slučajno radi.

Ono što okruženje projekta ne može je da popravi frontend koji je distribucija zapakovala. Zavisnosti tog programa su izgrađene za interpreter koji je izabrao menadžer paketa, a njegovo pokretanje unutar okruženja vašeg projekta ili ne uspeva ili proizvodi mešavinu koju niko ne podržava. Ubacivanje putanja u njega pomoću promenljive okruženja je ista greška sa dodatnim koracima: promenili ste šta alat učitava, a niste promenili protiv čega je testiran. Ta razmena izgleda kao popravka tačno dok se ne dođe do sledećeg uvoza.

Zašto je preusmeravanje sistemskog interpretera zamka

Menjanje podrazumevanog interpretera je privlačno jer izgleda da popravlja traceback jednom komandom. Ono takođe ruši pretpostavku na kojoj je izgrađen svaki zapakovani Python alat na hostu, a otkazi se pojavljuju kasnije i na nepovezanim mestima.

Mehanizmi za izbor alternative napravljeni su za prebacivanje između ekvivalentnih implementacija, a ne za instaliranje novijeg jezika pod starijim kompajliranim modulima. Kompajlirane ekstenzije se grade za određeni ABI, pa modul koji se juče uvozio danas može da ne učita bez ijednog uklonjenog paketa.

Postoji i zamka sa imenom u savetima koje ljudi nalaze. Komanda python bez verzije nema jedno univerzalno značenje među distribucijama i okruženjima, a njeno tretiranje kao fiksnog sinonima za određenu glavnu verziju daje popravke koje rade samo na mašini na kojoj su napisane. Čitajte politiku sistema pred sobom, a ne onu iz blog posta.

Odvojeni testovi prihvatanja

Na kraju pripadaju dva testa, a prolazak jednog ne govori ništa o drugom. Prvi je da podržana klijentska komanda radi sa interpreterom za koji je zapakovana. Drugi je da privilegovani servis uspostavlja sesiju i da tunel prenosi saobraćaj.

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

Održavajte nezavisan put do mašine dok radite, posebno ako VPN nosi vaš jedini administrativni pristup. Promena sistemskog interpretera je upravo vrsta izmene koja može da oduzme taj pristup na pola puta.

Ako je otkaz modul koji nedostaje za sistemski alat, popravka je operacija sa paketom kroz podržani tok rada. Ako je otkaz konflikt verzija u vašem sopstvenom projektu, popravka je okruženje. Izbor između ta dva je cela odluka, i njega određuje to koji je program štampao traceback.

Povezani članci