Python və Bash-i birləşdiririk: smart-env və python-shell kitabxanaları

Hər kəsə yaxşı günlər.

Bu gün Python, yalnız proqram məhsulları yaratmaq deyil, həm də onların infrastrukturlarını təmin etmək üçün ən çox istifadə olunan dillərdən biridir. Beləliklə, bir çox devops, istər istəməyərək, yeni bir dili öyrənməyə məcbur oldu ki, köhnə yaxşı Bash skriptlərinə əlavə olaraq istifadə etsin. Ancaq Bash və Python kod yazma yanaşmaları və müəyyən xüsusiyyətləri ilə fərqləndiyi üçün Bash skriptlərini "salam" dilinə köçürmək bəzən mürəkkəb və heç də asan bir tapşırıq olmur.

Devopsların həyatını asanlaşdırmaq üçün Python-da bir çox faydalı kitabxanalar və utilitlər yaradılıb və yaradılmağa davam edir. Bu məqalə müəllif tərəfindən yaradılmış iki yeni kitabxanani təsvir edir — smart-envpython-shell — və devopsların Python-un incəliklərinə çox vaxt sərf etmədən daha maraqlı işlərə fokuslanmalarına imkan vermək üçün yaradılıb. Bu kitabxanaların fəaliyyət sahəsi mühit dəyişənləri və xarici utilitlərin icrasıdır.

Maraqlananları aşağıya dəvət edirəm.

Yeni "skateboardlar"?

Niyə kifayət qədər adi əməliyyatlar üçün yeni paketlər yaratmaq lazımdır? Nə mane olur ki, birbaşa os.environ və subprocess-dan istifadə edəsiniz.<metod və ya nəzərdə tutduğunuz sinif>?

Hər bir kitabxana üçün sübutları ayrıca təqdim edəcəyəm.

smart-env kitabxanası

Öz əsərinizi yazmadan əvvəl, internetə baxmaq və hazır həllər axtarmaq faydalıdır. Əlbəttə, lazım olanı tapa bilməmək riski var, lakin bu daha çox "sığorta hadisəsi"-dir. Adətən, bu yanaşma işləyir və çox vaxt və enerji qənaəti təmin edir.

Aparılan axtarışın nəticəsinə görə axtarış aşağıdakı nəticələr əldə olunmuşdur:

  • os.environ-ə çağırışları əhatə edən paketlər var, lakin bununla birlikdə bir çox əlavə əməliyyatlar tələb edir (sinifin nümunəsinin yaradılması, çağırışlarda xüsusi parametrlər və s.);
  • İnkişaf etmiş, lakin müəyyən ekosistemə (əsasən Django kimi veb çərçivələrinə) sıx bağlı olan kifayət qədər yaxşı paketlər var, buna görə də heç bir düzəliş olmadan tamamilə ümumi deyillər;
  • Nə isə yeni bir şey etməyə çalışmaq üçün nadir cəhdlər var. Məsələn, tipizasiyayı əlavə etmək və dəyişənlərin dəyərlərini çağırış metodlarından istifadə edərək açıq şəkildə parslamağa çalışmaq
    get_<tip>(var_name)

    Yaxud burada başqa bir həll, lakin bir zamanlar məşhur olan Python 2-ni dəstəkləmir (buna baxmayaraq, rəsmi R.I.P., hələ də köhnə kodlarla dolu dağlar və tam ekosistemlər mövcuddur);

  • şagird və tələbə işləri, ümumiyyətlə, niyə PyPI-nin üst səviyyəsinə düşdüyü tam aydın deyil və yeni paketlərin adlandırılmasında problemlər yaradır (xüsusilə "smart-env" adı — məcburi bir tədbirdir).

Və bu siyahını uzun müddət davam etdirmək olar. Ancaq yuxarıda göstərilən maddələr də bir şey rahat və universal yaratmaq üçün ideya alovlandırmağa kifayət etdi.

smart-env yazılışı üçün qoyulan tələblər:

  • Son dərəcə sadə istifadə sxemi
  • Asan konfiqurasiya edilə bilən məlumat tipinin dəstəyi
  • Python 2.7 ilə uyğunluq
  • Kodda yaxşı test örtüyü

Nəticədə, bütün bunları həyata keçirmək mümkün oldu. İstifadə nümunəsi belədir:

from smart_env import ENV

print(ENV.HOME)  # os.environ['HOME']-a bərabərdir

# əgər çevrə dəyişəni MYVAR "True"-ya təyin edilibsə

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # boolean True-ya bərabərdir

ENV.NEW_VAR = 100  # Yeni bir çevrə dəyişəni təyin edir

Nümunədən göründüyü kimi, yeni sinifdən istifadə etmək üçün yalnız onu idxal etmək kifayətdir (nümunə yaratmağa ehtiyac yoxdur — lazımsız bir addımdır). Hər hansı bir çevrə dəyişəninə daxil olmaq, onu ENV sinifi kimi bir dəyişənə müraciət etməklə həyata keçirilir ki, bu da əslində bu sinifi yerli sistem çevrəsinə intuitiv bir qabıq edir, eyni zamanda onu demək olar ki, hər bir sistem üçün konfiqurasiya obyektinin mümkün bir variantına çevirir (bənzər yanaşma, məsələn, Django-da əldə edilir, orada konfiqurasiya obyekti birbaşa settings moduludur/paketidir).

Avtomatik tip dəyişdirmə dəstəyinin aktivləşdirilməsi/deaktivləşdirilməsi enable_automatic_type_cast() və disable_automatic_type_cast() iki metodu ilə həyata keçirilir. Bu, çevrə dəyişənində seriyalaşdırılmış JSON-a bənzər obyekt və ya sadəcə bir boolean sabiti varsa faydalı ola bilər (Djangoda DEBUG dəyişəninin qeydli şəkildə yazılması, çevrə dəyişəni ilə "qəbul edilən" sətirləri müqayisə edərək — tez-tez rast gəlinən hallardan biridir). Ancaq indi sətirləri açıq şəkildə çevirmək lazım deyil — lazım olan əməliyyatların əksəriyyəti kitabxananın dərinliklərində artıq mövcuddur və yalnız fəaliyyət siqnalını gözləyir. 🙂 Ümumiyyətlə, tip dəyişməsi şəffaf şəkildə işləyir və mövcud olan demək olar ki, bütün daxili məlumat tiplərini dəstəkləyir (frozenset, complex və bytes test edilməmişdir).

Python 2 dəstəyinin tələbi praktiki olaraq qurban vermədən həyata keçirildi (typing və Python 3-ün son versiyalarının "şəkərli konfetlər"-dən imtina edərək), xüsusən də omnipresent six sayəsində (metaklass istifadə problemlərini həll etmək üçün).

Amma bir az məhdudiyyətlər də var:

  • Python 3 dəstəyi 3.5 və ya daha yüksək versiyanı nəzərdə tutur (sizin layihənizdə bunun varlığı ya tənbəllik, ya da inkişaf ehtiyacının olmaması ilə bağlıdır, çünki hələ də 3.4-də oturmanız üçün obyekti səbəbləri düşünmək çətindir);
  • Python 2.7-də kitabxana dəstələrin ədədlərinin deserializasiyasını dəstəkləmir. Təsvir burada. Ancaq kiminsə bunu həyata keçirmək istəsə — xoş gəlmisiniz:);

Kitabxana eyni zamanda parsing xətaları üçün istisna mexanizmini həyata keçirir. Əgər sətiri heç bir mövcud analizator tərəfindən tanınmaya bilməzsə, dəyər string olaraq qalır (daha çox istifadə rahatlığı və Bash daxilində dəyişənlərin işləmə prinsipinə uyğunluq üçün).

python-shell kitabxanası

İndi ikinci kitabxanadan bəhs edəcəyəm (mövcud analoqların çatışmazlıqlarını qoyacağam — onlar smart-env ilə təsvir edilənə bənzəyir. Analoglar — buradaburada).

Ümumilikdə, icra ideyası və tələblər smart-env üçün təsvir edilənlərə bənzəyir, bunu nümunədən görmək olar:

from python_shell import Shell

Shell.ls('-l', '$HOME')  # "ls -l $HOME" ilə eynidir

command = Shell.whoami()  # "whoami" ilə eynidir
print(command.output)  # hazırki istifadəçi adınızı çap edir

print(command.command)  # "whoami" çap edir
print(command.return_code)  # "0" çap edir
print(command.arguments)  # "" çap edir

Shell.mkdir('-p', '\/tmp\/new_folder')  # yeni bir qovluq yaradır

İdeya belədir:

  1. Bash-ı Python dünyasında təcəssüm etdirən vahid sinif;
  2. Hər Bash əmri Shell sinifi kimi funksiya çağırışı edilir;
  3. Hər funksiyanın çağırma parametrləri müvafiq Bash əmrlərinin çağırışına ötürülür;
  4. Hər əmrlə çağırma anında icra edilir, yəni sinxron yanaşma var;
  5. əmrin stdout-da çıxdısına və onun dönüş koduna çıxış imkanı var;
  6. Əgər sistemdə əmr yoxdursa — istisna atılır.

Smart-env ilə olduğu kimi, Python 2 dəstəklənir (lakin daha çox qurban tələb olunur) və Python 3.0-3.4 dəstəyi yoxdur.

Kitabxanaların inkişaf planları

Kitabxanaları artıq istifadə edə bilərsiniz: ikisi də rəsmi PyPI-ya yerləşdirilib. Mənbə kodları Github-da mövcuddur (aşağıda baxın).

Hər iki kitabxana maraqlananlardan toplanan geribildirimləri nəzərə alaraq inkişaf edəcək. Və əgər smart-env üçün yeni xüsusiyyətlərin müxtəlifliyini düşünmək çətindirsə, python-shell-də əlavə ediləcək hələ çox şey var:

  • bloklanmayan çağırışların dəstəyi;
  • komanda ilə interaktiv ünsiyyət imkanı (stdin ilə işləmək);
  • yeni xüsusiyyətlərin əlavə edilməsi (məsələn, stderr-dən çıxışı almaq üçün property);
  • mövcud komandaların kataloqunun reallaşdırılması (dir() funksiyası ilə istifadə üçün);
  • və s.

Bağlantılar

  1. smart-env kitabxanası: GithubPyPI
  2. python-shell kitabxanası: GithubPyPI
  3. Telegram kanalı kitabxanaların yenilikləri

UPD 23.02.2020:
* Depolar köçürülüb, müvafiq bağlantılar yenilənib
* python-shell==1.0.1 versiyası 29.02.2020-ci ildə buraxılmağa hazırlanır. Dəyişikliklər arasında — komandaların avtomatik tamamlama dəstəyi və dir(Shell) komandası, Python-da etibarsız identifikatorla komandaların icrası, xətaların düzəldilməsi.

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster