Bir VPN yönetim komutu başladığında traceback belirir ve ilk dürtü başka bir Python kurmaya ya da sistem varsayılanını başka bir yere yöneltmeye koşar. Bu dürtü, birbiriyle hiçbir ilgisi olmayan iki çalışma zamanını karıştırır. Biri işletim sistemine ve onun paketlenmiş araçlarına aittir; diğeri kurduğunuz herhangi bir projeye aittir. İkincisini tatmin etmek için birincisini değiştirmek, çalışan bir masaüstünün paket yöneticisini kaybetmesinin yoludur.

Yapmaya değer karşılaştırma, gerçekte başarısız olan bileşen ile değiştirme hakkınız olan çalışma zamanı arasındadır. Neredeyse hiçbir zaman aynı nesne değildirler.

Tek gibi görünen iki Python sorusu

İlk soru şudur: traceback'i yazdıran programı hangi yorumlayıcı çalıştırdı? İkincisi: projem hangi yorumlayıcıyı kullanmalı? Bir terminalde aynı görünürler, çünkü ikisine de python3 yazarak yanıt verilir ve farklı sahipleri, farklı yükseltme yolları ve farklı etki yarıçapları vardır.

Bir sistem aracı, dağıtımının onunla birlikte gönderdiği yorumlayıcıya ve o yorumlayıcının ABI'sine karşı derlenmiş modüllere bağlıdır. Bir proje ise onun için oluşturduğunuz herhangi bir ortama bağlıdır. Sistem varsayılanını taşımak birincisini makinedeki her araç için aynı anda değiştirir; bir ortam oluşturmak ikincisini tek bir dizin için değiştirir.

Bu eylemlerden yalnızca biri bir dakika içinde geri alınabilir. O, birincisi değildir.

Hatayı hangi bileşen üretti

Başka bir şey okumadan önce traceback'in ilk satırını ve onu üreten çalıştırılabilir dosyayı okuyun. Komut satırı frontend'i, ayrıcalıklı hizmet ve API bağlantıları ayrı parçalardır ve yalnızca bazıları Python'dır.

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

Bir betiğin ilk satırı kullanacağı yorumlayıcıyı adlandırır ve traceback tam olarak o yorumlayıcıdan gelmiştir. Paket sorgusu dosyanın kime ait olduğunu söyler, bu da onu kimin değiştirebileceğini belirler. Hizmet durumu tamamen başka bir soruya yanıt verir: oturumları gerçekten açan ayrıcalıklı arka ucun çalışıp çalışmadığı.

Bir modül içe aktarma hatası, bir D-Bus etkinleştirme reddi ve reddedilen bir kimlik bilgisi üç farklı aşamadır. İçe aktarma hatası herhangi bir oturum var olmadan önce gerçekleşir, bu yüzden hiçbir VPN yapılandırması onu düzeltmez ve çalışan bir hizmet de onu düzeltmez. İletiyi bu üç aşamadan birine yerleştirmek asıl ilk adımdır.

Bir proje ortamının düzeltebildiği ve düzeltemediği şeyler

Bir proje ortamı bir proje sorununu çözer: bir uygulamanın ihtiyaç duyduğu tam kitaplık sürümlerini diğer her şeyden yalıtılmış olarak. Bu gerçekten yararlıdır ve başarısız olan program sizin kendi betiğiniz olduğunda doğru araçtır.

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

İkinci komut, belirli bir yorumlayıcının bağlantıların hangi kopyasını görebildiğini gösterir ve eksik bir paketi gölgelenmiş bir paketten ayırmanın en hızlı yolu budur. Onu başarısız betiğin kullandığı yorumlayıcıyla çalıştırın, tesadüfen çalışan başka biriyle değil.

Bir proje ortamının yapamadığı şey, dağıtım tarafından paketlenmiş bir frontend'i onarmaktır. O programın bağımlılıkları paket yöneticisinin seçtiği yorumlayıcı için derlenmiştir ve onu projenizin ortamında çalıştırmak ya başarısız olur ya da kimsenin desteklemediği bir karışım üretir. Ona bir ortam değişkeniyle yollar enjekte etmek, fazladan adımlarla aynı hatadır: aracın ne yüklediğini değiştirdiniz ama neye karşı test edildiğini değiştirmediniz. Bu takas, tam olarak bir sonraki içe aktarmaya ulaşana kadar düzeltme gibi görünür.

Sistem yorumlayıcısını yönlendirmek neden bir tuzaktır

Varsayılan yorumlayıcıyı değiştirmek çekicidir çünkü traceback'i tek bir komutla düzeltiyor gibi görünür. Ayrıca ana bilgisayardaki her paketlenmiş Python aracının üzerine kurulduğu varsayımı bozar ve hatalar daha sonra, ilgisiz yerlerde ortaya çıkar.

Alternatif seçme mekanizmaları eşdeğer uygulamalar arasında geçiş yapmak için tasarlandı, daha eski derlenmiş modüllerin altına daha yeni bir dil kurmak için değil. Derlenmiş uzantılar belirli bir ABI için derlenir, bu yüzden dün içe aktarılan bir modül bugün tek bir paket kaldırılmadan yüklenemeyebilir.

İnsanların bulduğu tavsiyelerde bir adlandırma tuzağı da vardır. Sürümsüz python komutunun dağıtımlar ve ortamlar arasında tek bir evrensel anlamı yoktur ve onu belirli bir ana sürümün sabit eşanlamlısı saymak yalnızca yazıldığı makinede çalışan düzeltmeler üretir. Blog yazısındaki politikayı değil, önünüzdeki sistemin politikasını okuyun.

Ayrı kabul testleri

Sonda iki test yer alır ve birini geçmek diğeri hakkında hiçbir şey söylemez. Birincisi, desteklenen istemci komutunun paketlendiği yorumlayıcıyla çalışmasıdır. İkincisi, ayrıcalıklı hizmetin bir oturum kurması ve tünelin trafiği taşımasıdır.

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

Çalışırken makineye bağımsız bir giriş yolu tutun, özellikle VPN tek yönetici erişiminizi taşıyorsa. Bir sistem yorumlayıcısında yapılan değişiklik, tam da o erişimi yarı yolda kaldırabilecek türde bir düzenlemedir.

Arıza bir sistem aracı için eksik modülse, düzeltme desteklenen iş akışı üzerinden bir paket işlemidir. Arıza kendi projenizde bir sürüm çakışmasıysa, düzeltme bir ortamdır. İkisi arasında seçim yapmak kararın tamamıdır ve bu, hangi programın traceback'i yazdırdığına göre belirlenir.

İlgili makaleler