Python və Bash dostları etmək: smart-env və python-shell kitabxanaları

Hər kəsə xeyirli günlər.

Bu gün Python yalnız proqram məhsullarını yaratmaq deyil, həm də onların infrastrukturunu təmin etmək sahəsində ən çox istifadə olunan dillərdən biridir. Nəticədə, bir çox devops, istər öz iradəsi, istərsə də əksinə, yaxşı köhnə Baş yazılarına əlavə olaraq sonradan istifadə etmək üçün yeni bir dil öyrənməli oldu. Bununla belə, Bash və Python kod yazmaq üçün fərqli yanaşmaları etiraf edir və müəyyən xüsusiyyətlərə malikdir, yəni Bash skriptlərini “ilan dilinə” köçürmək bəzən tutumlu və mənasız işlərdən uzaq olur.

Devopların həyatını asanlaşdırmaq üçün Python-da çoxlu faydalı kitabxanalar və yardım proqramları yaradılıb və yaradılmağa davam edir. Bu məqalə bu yazının müəllifi tərəfindən yaradılmış iki yeni kitabxananı təsvir edir - smart-env и piton qabığı - və devopları daha maraqlı tapşırıqlar üçün yer buraxaraq Python ilə işləməyin incəliklərinə çox diqqət yetirmək ehtiyacından azad etmək üçün nəzərdə tutulmuşdur. Kitabxanaların fəaliyyət dairəsi ətraf mühitin dəyişənləri və xarici kommunalların işə salınmasıdır.

Maraqlananlar zəhmət olmasa pişiyə baxsınlar.

Yeni "velosipedlər"?

Görünür, niyə kifayət qədər adi əməliyyatlar üçün yeni paketlər yaratmalısınız? os.environ və subprocess.<seçdiyiniz üsul və ya sinif> birbaşa istifadə etməyə nə mane olur?

Kitabxanaların hər birinin xeyrinə ayrı-ayrılıqda sübutlar təqdim edəcəyəm.

smart-env kitabxanası

Öz zehninizi yazmadan əvvəl internetə girib hazır həll yollarını axtarmaq faydalıdır. Əlbəttə ki, sizə lazım olanı tapmamaq riski var, amma bu, daha çox "sığorta hadisəsidir". Bir qayda olaraq, bu yanaşma işləyir və çox vaxt və səylərə qənaət edir.

Nəticələrə görə axtarış aşağıdakılar aşkar edilmişdir:

  • os.environ-a edilən zəngləri həqiqətən əhatə edən paketlər var, lakin eyni zamanda diqqəti yayındıran bir dəstə hərəkət tələb edir (sinif nümunəsinin yaradılması, zənglərdə xüsusi parametrlər və s.);
  • Yaxşı paketlər var, lakin onlar müəyyən bir ekosistemə (əsasən Django kimi veb çərçivələr) ciddi şəkildə bağlıdırlar və buna görə də faylsız heç də universal deyillər;
  • yeni bir şey etmək üçün nadir cəhdlər var. Misal üçün, yazaraq əlavə edin kimi metodları çağıraraq dəyişən dəyərləri açıq şəkildə təhlil edin
    get_<typename>(var_name)

    Ya da burada daha bir həll, lakin indi rüsvay olmuş Python 2-ni dəstəkləmir (buna baxmayaraq rəsmi RIP, hələ də yazılı kod dağları və bütün ekosistemlər var);

  • Məktəb-şagird sənətkarlıqları var ki, nədənsə naməlum səbəblərdən yuxarı PyPI-də sona çatdı və yalnız yeni paketlərin adlandırılması ilə bağlı problemlər yaradır (xüsusən də “smart-env” adı zəruri tədbirdir).

Və bu siyahını uzun müddət davam etdirmək olar. Bununla belə, yuxarıdakı məqamlar məni rahat və universal bir şey etmək fikri ilə həyəcanlandırmaq üçün kifayət idi.

smart-env yazmadan əvvəl qoyulmuş tələblər:

  • Ən sadə istifadə sxemi
  • Asanlıqla konfiqurasiya edilə bilən məlumat yazma dəstəyi
  • Python 2.7 uyğun gəlir
  • Testlərlə yaxşı kod əhatəsi

Nəhayət, bütün bunlar reallaşdı. Budur istifadə nümunəsi:

from smart_env import ENV

print(ENV.HOME)  # Equals print(os.environ['HOME'])

# assuming you set env variable MYVAR to "True"

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # Equals boolean True

ENV.NEW_VAR = 100  # Sets a new environment variable

Nümunədən göründüyü kimi, yeni siniflə işləmək üçün onu idxal etmək kifayətdir (məsələn, əlavə hərəkəti çıxmaq şərti ilə yaratmağa ehtiyac yoxdur). İstənilən mühit dəyişəninə giriş ona ENV sinifinin dəyişəni kimi istinad etməklə əldə edilir ki, bu da əslində bu sinfi yerli sistem mühiti üçün intuitiv sarğı edir, eyni zamanda onu demək olar ki, hər hansı bir sistem üçün mümkün konfiqurasiya obyektinə çevirir ( oxşar yanaşma, məsələn, Django-da əldə edilir, yalnız orada konfiqurasiya obyekti parametrlər modulunun/paketin özüdür).

Avtomatik yazmağa dəstək rejimini aktivləşdirmək/deaktiv etmək iki üsuldan istifadə etməklə həyata keçirilir - enable_automatic_type_cast() və disable_automatic_type_cast(). Əgər mühit dəyişəni seriallaşdırılmış JSON-a bənzər obyekt və ya hətta sadəcə Boolean sabitini ehtiva edirsə, bu rahat ola bilər (mühit dəyişənini “etibarlı” sətirlərlə müqayisə edərək Django-da DEBUG dəyişənini açıq şəkildə təyin etmək ən çox yayılmış hallardan biridir). Ancaq indi sətirləri açıq şəkildə çevirməyə ehtiyac yoxdur - lazımi hərəkətlərin əksəriyyəti artıq kitabxananın dərinliklərinə yerləşdirilib və sadəcə hərəkət etmək üçün bir siqnal gözləyir. 🙂 Ümumiyyətlə, yazmaq şəffaf işləyir və demək olar ki, bütün mövcud daxili məlumat növlərini dəstəkləyir (frozenset, kompleks və baytlar sınaqdan keçirilməyib).

Python 2-ni dəstəkləmək tələbi praktiki olaraq heç bir fədakarlıqla (yazmaqdan imtina və Python 3-ün ən son versiyalarının bəzi “şəkər konfetləri”), xüsusən də hər yerdə mövcud olan altılıq sayəsində (metaklasslardan istifadə problemlərini həll etmək üçün) həyata keçirildi. .

Ancaq bəzi məhdudiyyətlər var:

  • Python 3 dəstəyi 3.5 və daha yüksək versiya deməkdir (onların layihənizdə olması ya tənbəlliyin və ya təkmilləşdirmə ehtiyacının olmamasının nəticəsidir, çünki hələ də 3.4-də olmanızın obyektiv səbəbini tapmaq çətindir);
  • Python 2.7-də kitabxana set literallarının seriyadan çıxarılmasını dəstəkləmir. Təsvir burada. Amma bunu həyata keçirmək istəyən varsa buyursun :);

Kitabxanada təhlil xətaları zamanı istisna mexanizmi də var. Əgər sətir mövcud analizatorlardan hər hansı biri tərəfindən tanınmazsa, dəyər sətir olaraq qalır (daha doğrusu, rahatlıq və dəyişənlərin Bash-də işləməsinin adi məntiqi ilə geriyə uyğunluq səbəbi ilə).

python shell kitabxanası

İndi sizə ikinci kitabxana haqqında danışacağam (mövcud analoqların çatışmazlıqlarının təsvirini buraxacağam - bu smart-env üçün təsvir edilənə bənzəyir. Analoqlar - burada и burada).

Ümumiyyətlə, həyata keçirmək ideyası və ona olan tələblər, misaldan göründüyü kimi smart-env üçün təsvir edilənlərə bənzəyir:

from python_shell import Shell

Shell.ls('-l', '$HOME')  # Equals "ls -l $HOME"

command = Shell.whoami()  # Equals "whoami"
print(command.output)  # prints your current user name

print(command.command)  # prints "whoami"
print(command.return_code)  # prints "0"
print(command.arguments)  # prints ""

Shell.mkdir('-p', '/tmp/new_folder')  # makes a new folder

İdeya budur:

  1. Python dünyasında Bash-ı təmsil edən tək sinif;
  2. Hər bir Bash əmri Shell sinfinin funksiyası kimi çağırılır;
  3. Hər bir funksiya çağırışı üçün parametrlər daha sonra müvafiq Bash əmr çağırışına ötürülür;
  4. Hər bir əmr çağırıldığı anda "burada və indi" yerinə yetirilir, yəni. sinxron yanaşma işləyir;
  5. stdout-da əmrin çıxışına, həmçinin onun qaytarma koduna daxil olmaq mümkündür;
  6. Komanda sistemdə deyilsə, istisna atılır.

smart-env-də olduğu kimi, Python 2 üçün dəstək var (baxmayaraq ki, bir az daha qurban qanı tələb olunurdu) və Python 3.0-3.4 üçün dəstək yoxdur.

Kitabxananın inkişaf planları

Siz indi kitabxanalardan istifadə edə bilərsiniz: hər ikisi rəsmi PyPI-də yerləşdirilib. Mənbələr Github-da mövcuddur (aşağıya bax).

Hər iki kitabxana maraqlı şəxslərdən toplanan rəylər nəzərə alınmaqla inkişaf etdiriləcək. Və smart-env-də müxtəlif yeni funksiyalar tapmaq çətin ola bilərsə, o zaman python-shell-də mütləq əlavə etmək üçün başqa bir şey var:

  • bloklanmayan zənglər üçün dəstək;
  • komanda ilə interaktiv ünsiyyət imkanı (stdin ilə işləmək);
  • yeni xassələrin əlavə edilməsi (məsələn, stderr-dən çıxış almaq üçün əmlak);
  • mövcud əmrlər kataloqunun həyata keçirilməsi (dir() funksiyası ilə istifadə üçün);
  • və s.

References

  1. smart-env kitabxanası: Github и PyPI
  2. python shell kitabxanası: Github и PyPI
  3. Telegram kanalı kitabxana yeniləmələri

UPD 23.02.2020/XNUMX/XNUMX:
* Repozitoriyalar köçürülüb, müvafiq keçidlər yenilənib
* Python-shell==1.0.1 versiyası 29.02.2020/XNUMX/XNUMX-ci il tarixində buraxılış üçün hazırlanır. Dəyişikliklərə avtomatik tamamlama əmri və dir(Shell) əmri dəstəyi, etibarsız Python identifikatoru ilə işləyən əmrlər və xətaların düzəldilməsi daxildir.

Mənbə: www.habr.com

Добавить комментарий