Łączymy Pythona i Bash: wydanie bibliotek python-shell i smart-env v. 1.0.1

Dzień dobry wszystkim!

29 lutego 2020 roku odbyła się oficjalna mikro-referencja bibliotek smart-env i python-shell. Dla tych, którzy nie są na bieżąco, proponuję wcześniejsze przeczytanie pierwszego posta.

Krótko mówiąc, wśród zmian są: autouzupełnianie poleceń, rozszerzone możliwości uruchamiania poleceń, trochę refaktoryzacji oraz poprawki błędów.

Po szczegóły zapraszam pod kat.

Co nowego w python-shell?

Zacznę od deseru.

Automatyczne uzupełnianie poleceń

Zgadzam się — to wygodne, kiedy edytor/IDE/terminal podpowiada nazwę polecenia, a czasami także parametry jego wywołania? Python-shell stopniowo rozwija tę funkcjonalność. Z uwagi na to, że pola klasy Shell pod kapotą de-facto nie są jego polami (wszechobecny __getattr__), autouzupełnianie zostało stworzone również od podstaw (przez przeciążenie, odpowiednio, metody __dir__). Obecnie autouzupełnianie działa w środowiskach BPython i IPython. Oczywiście, chcielibyśmy zobaczyć integrację z bardziej uznawanymi produktami, takimi jak PyCharm, i w tym kierunku prowadzone są badania możliwości realizacji.

Dodanie właściwości

W ramach wydania klasa Shell otrzymała nową właściwość last_command. Potrzeba ta wynikła z faktu, że podczas generowania wyjątku ShellException przez polecenie z niezerowym kodem zwrotu obiekt Command nie był zwracany z wywołania __call__() obiektu polecenia. Teraz istnieje możliwość zrobienia tak:

try:
    command = Shell.touch('/foo.txt')
except ShellException:
    command = Shell.last_command

Również lista właściwości obiektu Command została rozszerzona. Dodano pole errors, które zwraca wynik polecenia do strumienia błędu.

Uruchamianie poleceń z nieprawidłowymi nazwami w Pythonie

Praktycznie w każdym systemie istnieje przynajmniej jeden program, którego nazwa nie pasuje jako identyfikator w Pythonie (na przykład znane narzędzie 2to3). Wywołanie go za pomocą

Shell.2to3()

nie będzie możliwe — interpreter tego nie przepuści.
Rozwiązanie — wywołać polecenie okrężną drogą:

Shell("2to3")  # zwraca obiekt polecenia

Warto zauważyć, że w ten sam sposób można uruchamiać również poprawne z punktu widzenia interpretera polecenia, co daje możliwość tworzenia elastycznych skryptów, takich jak

cmd = "python{}".format(sys.version_info[0])
Shell(cmd)(*args, **kwargs)

Drobne zmiany

  • Zrealizowane metody __repr__() i __str__() obiektu klasy Command, które teraz zwracają intuicyjnie zrozumiałe wartości (polecenie z parametrami oraz jego stdout).
  • Drobne poprawki w kodzie.
  • Dodanie pokrycia testami, a także reorganizacja istniejących.
  • Dodanie klas Subprocess i Process, których celem jest stworzenie dodatkowego poziomu abstrakcji przy pracy z modułem subprocess. W dużej mierze jest to konieczne w celu wyeliminowania powtórzeń kodu przy pracy z Pythonem 2/3, ale potencjalnie może także przynieść inne korzyści.

Co nowego w smart-env?

W odróżnieniu od python-shell, w bibliotece smart-env zmiany były niewielkie. Powód jest prosty — brak wolnego czasu, w wyniku czego niektóre potencjalne ulepszenia (np. autouzupełnianie zmiennych środowiskowych) zostały przeniesione na kolejny wydanie.

Faktycznie, w bibliotece wprowadzono następujące zmiany:

  • Drobne poprawki w kodzie.
  • Refaktoryzacja.
  • Reorganizacja i poprawa istniejących testów.

Plany dotyczące kolejnych wydań

Biblioteka python-shell

  • Dodanie wsparcia dla nieblokujących wywołań komend (paralelizacja wykonania).

Biblioteka smart-env

  • Realizacja autouzupełniania zmiennych środowiskowych w klasie ENV.
  • Wsparcie dla operatora in w celu sprawdzenia istnienia zmiennej env.
  • Realizacja wsparcia dla funkcji str() i repr() dla klasy ENV.

Daty kolejnych wydań zostaną ogłoszone w następujących kanałach komunikacji:

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster