VPN удирдлагын команд эхлэх үед Traceback гарч ирдэг бөгөөд эхний зөн совин өөр 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 хэвлэсэн програм тодорхойлно.

Холбоотой нийтлэлүүд