Python ve Bash Dostluğu Kurmak: smart-env ve python-shell kitaplıkları

Herkese iyi günler.

Günümüzde Python sadece yazılım ürünlerinin oluşturulmasında değil aynı zamanda bunların altyapılarının sağlanmasında da alanında en çok kullanılan dillerden biridir. Sonuç olarak, birçok devop, ister kendi istekleriyle ister karşı çıksın, eski güzel Bash komut dosyalarına ek olarak daha sonra kullanmak üzere yeni bir dil öğrenmek zorunda kaldı. Ancak Bash ve Python, kod yazma konusunda farklı yaklaşımlara sahiptir ve belirli özelliklere sahiptir; bu, Bash komut dosyalarını "yılan diline" taşımanın bazen kapsamlı ve önemsiz olmaktan uzak bir iş olduğu anlamına gelir.

Geliştiricilerin hayatını kolaylaştırmak için Python'da birçok faydalı kütüphane ve yardımcı program oluşturuldu ve oluşturulmaya devam ediyor. Bu makalede, bu yazının yazarı tarafından oluşturulan iki yeni kütüphane anlatılmaktadır - akıllı ortam и piton kabuğu - ve geliştiricileri Python ile çalışmanın inceliklerine çok fazla dikkat etme ihtiyacından kurtarmak ve daha ilginç görevlere yer bırakmak için tasarlandı. Kütüphanelerin faaliyet kapsamı ortam değişkenleri ve harici yardımcı programların başlatılmasıdır.

İlgilenenler lütfen kediye bakın.

Yeni "bisikletler" mi?

Görünüşe göre neden oldukça sıradan işlemler için yeni paketler yaratalım ki? os.environ ve subprocess.<seçtiğiniz yöntem veya sınıf>'ı doğrudan kullanmanızı engelleyen nedir?

Her kütüphanenin lehine ayrı ayrı delil sunacağım.

akıllı-env kütüphanesi

Kendi beyin çocuğunuzu yazmadan önce internete girip hazır çözümler aramakta fayda var. Elbette ihtiyacınız olanı bulamama riski var ama bu daha ziyade bir “sigorta olayı”. Kural olarak, bu yaklaşım işe yarar ve çok fazla zaman ve çaba tasarrufu sağlar.

Sonuçlara göre arama motoru şu ortaya çıktı:

  • aslında os.environ'a yapılan çağrıları saran paketler var, ancak aynı zamanda bir dizi dikkat dağıtıcı eylem gerektiriyor (bir sınıfın örneğini oluşturmak, çağrılarda özel parametreler vb.);
  • Bununla birlikte, belirli bir ekosisteme (çoğunlukla Django gibi web çerçeveleri) sıkı sıkıya bağlı olan ve bu nedenle dosya olmadan hiç de evrensel olmayan iyi paketler vardır;
  • yeni bir şey yapmaya yönelik nadir girişimler vardır. Örneğin, yazmayı ekle ve aşağıdaki gibi yöntemleri çağırarak değişken değerlerini açıkça ayrıştırın
    get_<typename>(var_name)

    Ya da burada bir çözüm dahaancak bu artık gözden düşmüş Python 2'yi desteklemiyor (ki buna rağmen) resmi RIP, hala dağlarca yazılı kod ve tüm ekosistemler var);

  • Bilinmeyen bir nedenden ötürü PyPI'nin yukarısında kalan ve yalnızca yeni paketlerin adlandırılmasında sorun yaratan okul öğrencisi zanaatları var (özellikle "smart-env" adı gerekli bir önlemdir).

Ve bu liste uzun süre devam edebilir. Ancak yukarıdaki noktalar, kullanışlı ve evrensel bir şey yapma fikri konusunda beni heyecanlandırmaya yetti.

Smart-env yazılmadan önce belirlenen gereksinimler:

  • En basit kullanım şeması
  • Kolayca yapılandırılabilir veri yazma desteği
  • Python 2.7 uyumlu
  • Testlere göre iyi kod kapsamı

Sonuçta bunların hepsi gerçekleşti. İşte bir kullanım örneği:

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

Örnekte görebileceğiniz gibi, yeni bir sınıfla çalışmak için onu içe aktarmanız yeterlidir (bir örnek oluşturmanıza gerek yoktur - ekstra eylem hariç). Herhangi bir ortam değişkenine erişim, buna ENV sınıfının bir değişkeni olarak atıfta bulunarak elde edilir; bu, aslında bu sınıfı yerel sistem ortamı için sezgisel bir sarmalayıcı haline getirirken aynı zamanda onu hemen hemen her sistem için olası bir yapılandırma nesnesine dönüştürür ( örneğin Django'da benzer bir yaklaşım elde edilmiştir, yalnızca orada yapılandırma nesnesi ayarlar modülünün/paketinin kendisidir).

Otomatik yazma desteği modunun etkinleştirilmesi/devre dışı bırakılması iki yöntem kullanılarak gerçekleştirilir: active_automatic_type_cast() vedisable_automatic_type_cast(). Ortam değişkeni serileştirilmiş JSON benzeri bir nesne veya hatta yalnızca bir Boolean sabiti içeriyorsa bu kullanışlı olabilir (ortam değişkenini "geçerli" dizelerle karşılaştırarak Django'da DEBUG değişkenini açıkça ayarlamak en yaygın durumlardan biridir). Ancak artık dizeleri açık bir şekilde dönüştürmeye gerek yok; gerekli eylemlerin çoğu zaten kitaplığın derinliklerine yerleştirilmiştir ve yalnızca bir sinyalin harekete geçmesini beklemektedir. 🙂 Genel olarak, yazma şeffaf bir şekilde çalışır ve neredeyse tüm mevcut yerleşik veri türlerini destekler (dondurulmuş küme, karmaşık ve baytlar test edilmemiştir).

Python 2'yi destekleme gerekliliği, özellikle her yerde bulunan altı (metasınıf kullanma sorunlarını çözmek için) sayesinde neredeyse hiç fedakarlık yapılmadan (yazmanın terk edilmesi ve Python 3'ün en son sürümlerindeki bazı "şeker şekerleri") uygulandı. .

Ancak bazı kısıtlamalar var:

  • Python 3 desteği, sürüm 3.5 ve üstü anlamına gelir (projenizdeki varlıkları ya tembellikten ya da iyileştirme ihtiyacının olmayışından kaynaklanmaktadır, çünkü neden hala 3.4'te olduğunuzun nesnel bir nedenini bulmak zordur);
  • Python 2.7'de kitaplık, ayarlanan değişmezlerin seri durumdan çıkarılmasını desteklemez. Tanım burada. Ama uygulamak isteyen olursa buyursun :);

Kütüphane aynı zamanda ayrıştırma hatalarına karşı bir istisna mekanizmasına da sahiptir. Eğer dize mevcut analizörlerden herhangi biri tarafından tanınamadıysa, değer bir dize olarak kalır (bunun yerine kolaylık sağlamak ve değişkenlerin Bash'te nasıl çalıştığına ilişkin olağan mantıkla geriye dönük uyumluluk sağlamak amacıyla).

python-kabuk kütüphanesi

Şimdi size ikinci kütüphaneden bahsedeceğim (Mevcut analogların eksikliklerinin açıklamasını atlayacağım - akıllı ortam Analogları için anlatılana benzer - burada и burada).

Genel olarak, uygulama fikri ve bunun için gereklilikler, örnekten de görülebileceği gibi, smart-env için açıklananlara benzer:

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

Fikir şu:

  1. Python dünyasında Bash'i temsil eden tek bir sınıf;
  2. Her Bash komutu, Shell sınıfının bir fonksiyonu olarak çağrılır;
  3. Her işlev çağrısının parametreleri daha sonra karşılık gelen Bash komut çağrısına aktarılır;
  4. Her komut, çağrıldığı anda "burada ve şimdi" yürütülür; eşzamanlı yaklaşım işe yarıyor;
  5. stdout'ta bir komutun çıktısına ve dönüş koduna erişmek mümkündür;
  6. Komut sistemde değilse bir istisna oluşturulur.

Smart-env'de olduğu gibi Python 2 desteği mevcut (gerçi biraz daha fazla kurban kanı gerekliydi) ve Python 3.0-3.4 desteği yok.

Kütüphane geliştirme planları

Artık kütüphaneleri kullanabilirsiniz: her ikisi de resmi PyPI'de yayınlanmıştır. Kaynaklar Github'da mevcuttur (aşağıya bakınız).

Her iki kütüphane de ilgilenenlerden toplanan geri bildirimler dikkate alınarak geliştirilecektir. Ve eğer smart-env'de çeşitli yeni özellikler bulmak zor olabilirse, o zaman python-shell'de kesinlikle eklenecek başka bir şey var:

  • engellenmeyen aramalar için destek;
  • ekiple etkileşimli iletişim imkanı (stdin ile çalışma);
  • yeni özellikler ekleme (örneğin, stderr'den çıktı alma özelliği);
  • mevcut komutların bir dizininin uygulanması (dir() işleviyle kullanım için);
  • vb

referanslar

  1. akıllı-env kütüphanesi: Github и PyPI
  2. python-kabuk kütüphanesi: Github и PyPI
  3. Telgraf kanalı kütüphane güncellemeleri

UPD 23.02.2020:
* Depolar taşındı, ilgili bağlantılar güncellendi
* Sürüm python-shell==1.0.1 29.02.2020 tarihinde yayınlanmak üzere hazırlanıyor. Değişiklikler arasında otomatik komut tamamlama ve dir(Shell) komutu desteği, komutların geçersiz Python tanımlayıcısıyla çalıştırılması ve hata düzeltmeleri yer alıyor.

Kaynak: habr.com

Yorum ekle