Python жана Bash достугун түзүү: smart-env жана python-shell китепканалары

Кутман күн, баарыңыздарга.

Бүгүнкү күндө, Python программалык продуктыларды түзүү гана эмес, ошондой эле алардын инфраструктурасын камсыз кылуу жаатындагы эң көп колдонулган тилдердин бири. Натыйжада, көптөгөн девоптор, алардын эрки мененби же ага каршыбы, жаңы тилди кийинчерээк эски Баш жазууларына кошумча катары үйрөнүүгө туура келген. Бирок, Bash жана Python код жазууга ар кандай мамиле жасашат жана белгилүү бир өзгөчөлүктөргө ээ, башкача айтканда, Bash скрипттерин "жылан тилине" көчүрүү кээде сыйымдуу жана анчалык деле маанилүү эмес иш болуп калат.

Devops үчүн жашоону жеңилдетүү үчүн, Python'до көптөгөн пайдалуу китепканалар жана утилиталар түзүлдү жана түзүлүүдө. Бул макалада ушул посттун автору тарабынан түзүлгөн эки жаңы китепкана сүрөттөлөт - smart-env и питон-кабык - жана кызыктуураак тапшырмалар үчүн орун калтырып, Python менен иштөөнүн татаалдыктарына көп көңүл буруу зарылдыгынан devops бошотуу үчүн иштелип чыккан. Китепканалардын иш чөйрөсү айлана-чөйрөнүн өзгөрмөлөрү жана тышкы утилиталарды ишке киргизүү болуп саналат.

Кимге кызыкса, мышыкты көрүңүз.

Жаңы "велосипеддер"?

Кадимки операциялар үчүн жаңы пакеттерди түзүү эмне үчүн керек? os.environ жана subprocess.<метод же сиз тандаган класс> түздөн-түз колдонууга эмне тоскоолдук кылат?

Ар бир китепкананын пайдасына өзүнчө далил келтирем.

smart-env китепканасы

Өзүңүздүн оюңузду жазуудан мурун Интернетке кирип, даяр чечимдерди издөө пайдалуу. Албетте, керектүү нерсени таппай калуу коркунучу бар, бирок бул, тескерисинче, "камсыздандыруу окуясы". Эреже катары, бул ыкма иштейт жана көп убакытты жана күч-аракетти үнөмдөйт.

Жыйынтыгы боюнча издөө төмөндөгүлөр аныкталды:

  • чындыгында os.environ чалууларды ороп турган пакеттер бар, бирок ошол эле учурда бир топ алаксытуу аракеттерди талап кылат (класстын инстанциясын түзүү, чалууларда атайын параметрлер ж.б.);
  • Жакшы пакеттер бар, бирок алар белгилүү бир экосистемага катуу байланышкан (негизинен Django сыяктуу веб алкактары) жана ошондуктан файлсыз таптакыр универсалдуу эмес;
  • жаңы нерсе жасоого сейрек аракеттер бар. Мисалы, терүү кошуу сыяктуу ыкмаларды чакыруу менен өзгөрүлмө маанилерди ачык талдоо
    get_<typename>(var_name)

    же бул жерде дагы бир чечим, бирок, азыр маскараланган Python 2ди колдобойт (ошого карабастан расмий RIP, дагы эле жазылган код жана бүтүндөй экосистемалардын тоолору бар);

  • мектеп окуучуларынын кол өнөрчүлүктөрү бар, алар кандайдыр бир белгисиз себептерден улам, PyPI агымынын жогору жагында аяктаган жана жаңы пакеттерге ат коюуда гана көйгөйлөрдү жаратат (атап айтканда, “smart-env” аталышы зарыл чара).

Ал эми бул тизмени көпкө уланта берсе болот. Бирок, жогоруда айтылган пункттар мени ыңгайлуу жана универсалдуу нерсе жасоо идеясына кызыктыруу үчүн жетиштүү болду.

smart-env жазуудан мурун коюлган талаптар:

  • Эң жөнөкөй колдонуу схемасы
  • Оңой конфигурациялануучу маалыматтарды терүүнү колдоо
  • Python 2.7 шайкеш келет
  • Тесттер менен жакшы код камтуу

Акыры мунун баары ишке ашты. Бул жерде колдонуунун бир мисалы болуп саналат:

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

Мисалдан көрүнүп тургандай, жаңы класс менен иштөө үчүн аны импорттоо керек (мисалы түзүүнүн кереги жок - кошумча аракетти алып салуу). Каалаган чөйрө өзгөрмөсүнө жетүү аны ENV классынын өзгөрмөсү катары көрсөтүү аркылуу ишке ашат, бул, чындыгында, бул классты түпкү системанын чөйрөсү үчүн интуитивдик каптоочуга айландырат, ошол эле учурда аны дээрлик бардык системалар үчүн мүмкүн болгон конфигурация объектисине айлантат ( окшош ыкма, мисалы, Django жетишилет, ошол жерде гана конфигурация объекти орнотуулар модулу/пакет өзү болуп саналат).

Автоматтык терүүнү колдоо режимин иштетүү/өчүрүү эки ыкманын жардамы менен ишке ашат - enable_automatic_type_cast() жана disable_automatic_type_cast(). Бул чөйрө өзгөрмөсүндө серияланган JSON сыяктуу объект же жөн гана логикалык константа камтылса, ыңгайлуу болушу мүмкүн (Джангодо DEBUG өзгөрмөсүн чөйрө өзгөрмөсүн “жарамдуу” саптар менен салыштыруу ачык коюу эң кеңири таралган учурлардын бири). Бирок азыр саптарды ачык конвертациялоонун кереги жок - керектүү иш-аракеттердин көбү китепкананын тереңдигине камтылган жана жөн гана иш-аракет кылуу үчүн сигналды күтүп жатышат. 🙂 Жалпысынан алганда, терүү ачык-айкын иштейт жана дээрлик бардык орнотулган маалымат түрлөрүн колдойт (frozenset, татаал жана байттар текшерилген эмес).

Python 2ди колдоо талабы дээрлик эч кандай курмандыктарсыз ишке ашырылган (терүүдөн баш тартуу жана Python 3тин акыркы версияларынын кээ бир “кант конфеттери”), атап айтканда, бардык жердеги алтылыктын аркасында (метакласстарды колдонуу көйгөйлөрүн чечүү үчүн) ).

Бирок кээ бир чектөөлөр бар:

  • Python 3 колдоосу 3.5 жана андан жогорку версияларды билдирет (алардын сиздин долбооруңузда болушу жалкоолуктун же өркүндөтүүгө муктаж эместиктин натыйжасы, анткени сиз дагы эле 3.4-те экениңиздин объективдүү себебин табуу кыйын);
  • Python 2.7де китепкана белгиленген литералдарды сериядан чыгарууну колдобойт. Description бул жерде. Бирок кимдир бирөө аны ишке ашыргысы келсе, кош келиңиз :);

Китепканада талдоо каталары болгон учурда өзгөчө механизм бар. Эгерде сапты жеткиликтүү анализаторлордун бири да тааный албаса, анда маани сап бойдон кала берет (тескерисинче, ыңгайлуулук жана Bash'те өзгөрмөлөр кантип иштешинин кадимки логикасы менен артка шайкештик үчүн).

python-shell китепканасы

Эми мен экинчи китепкана жөнүндө айтып берем (мен учурдагы аналогдордун кемчиликтерин сыпаттабайм - бул смарт-энв үчүн сүрөттөлгөндөй окшош. Аналогдор - бул жерде и бул жерде).

Жалпысынан алганда, ишке ашыруу идеясы жана ага коюлган талаптар, мисалдан көрүнүп тургандай, smart-env үчүн айтылгандарга окшош:

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

Идея бул:

  1. Python дүйнөсүндөгү Башты чагылдырган жалгыз класс;
  2. Ар бир Bash буйругу Shell классынын функциясы катары чакырылат;
  3. Ар бир функциянын чалуусунун параметрлери андан кийин тиешелүү Bash буйрук чакыруусуна өткөрүлөт;
  4. Ар бир команда чакырылган учурда "бул жерде жана азыр" аткарылат, б.а. синхрондук ыкма иштейт;
  5. stdout ичиндеги буйруктун чыгышына, ошондой эле анын кайтарып берүү кодун алууга болот;
  6. Эгерде буйрук системада жок болсо, анда өзгөчөлүк ташталат.

smart-env сыяктуу эле, Python 2 колдоо бар (бирок бир аз көбүрөөк курмандык кан талап кылынган) жана Python 3.0-3.4 үчүн колдоо жок.

Китепкананы өнүктүрүү пландары

Сиз азыр китепканаларды колдоно аласыз: экөө тең расмий PyPIде жайгаштырылган. Булактар ​​Githubда жеткиликтүү (төмөндө караңыз).

Эки китепкана тең кызыккандардын пикирлерин эске алуу менен иштелип чыгат. Жана, эгерде smart-envде ар кандай жаңы функцияларды табуу кыйын болсо, анда python-shellде сөзсүз түрдө дагы бир нерсе кошуу керек:

  • бөгөттөлбөгөн чалууларды колдоо;
  • команда менен интерактивдүү баарлашуу мүмкүнчүлүгү (stdin менен иштөө);
  • жаңы касиеттерди кошуу (мисалы, stderrден чыгарууну алуу үчүн касиет);
  • жеткиликтүү командалардын каталогун ишке ашыруу (dir() функциясы менен колдонуу үчүн);
  • жана башкалар.

шилтемелер

  1. smart-env китепканасы: Github и P&IP
  2. python-shell китепканасы: Github и P&IP
  3. Телеграммада мындай канал китепкана жаңыртуулары

UPD 23.02.2020/XNUMX/XNUMX:
* Репозиторийлер жылдырылды, тиешелүү шилтемелер жаңыртылды
* python-shell==1.0.1 версиясы 29.02.2020/XNUMX/XNUMX чыгарууга даярдалууда. Өзгөртүүлөр команданы автотолтурууну жана dir(Shell) буйругун колдоону, жараксыз Python идентификатору менен буйруктарды иштетүүнү жана мүчүлүштүктөрдү оңдоолорду камтыйт.

Source: www.habr.com

Комментарий кошуу