Python және Bash достығын құру: smart-env және python-shell кітапханалары

Қайырлы күн баршаңызға.

Бүгінгі таңда Python тек бағдарламалық өнімдерді жасау ғана емес, сонымен қатар олардың инфрақұрылымын қамтамасыз ету саласындағы ең көп қолданылатын тілдердің бірі болып табылады. Нәтижесінде, көптеген девоптар, өз еркімен немесе оған қарсы ма, жақсы ескі Баш сценарийлеріне қосымша ретінде кейінірек пайдалану үшін жаңа тілді үйренуге мәжбүр болды. Дегенмен, Bash және Python код жазудың әртүрлі тәсілдерін мойындайды және белгілі бір мүмкіндіктерге ие, яғни Bash сценарийлерін «жылан тіліне» көшіру кейде сыйымды және тривиальды тапсырма болып шығады.

Девоптардың өмірін жеңілдету үшін Python-да көптеген пайдалы кітапханалар мен утилиталар жасалды және жасалуда. Бұл мақалада осы жазбаның авторы жасаған екі жаңа кітапхана сипатталған - smart-env и питон-қабық - және devops Python-мен жұмыс істеудің қыр-сырына көп көңіл бөлу қажеттілігінен арылту үшін жасалған, қызықтырақ тапсырмаларға орын қалдырады. Кітапханалардың қызмет аясы қоршаған орта айнымалылары және сыртқы утилиталарды іске қосу болып табылады.

Қызығушылық танытқандар мысықты қараңыздар.

Жаңа «велосипедтер»?

Неліктен қарапайым операциялар үшін жаңа пакеттер жасау керек сияқты? 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 тәрізді нысанды немесе тіпті жай ғана логикалық тұрақтыны қамтитын болса, ыңғайлы болуы мүмкін (ортаның айнымалы мәнін «жарамды» жолдармен салыстыру арқылы Django жүйесінде DEBUG айнымалы мәнін анық орнату - ең көп таралған жағдайлардың бірі). Бірақ қазір жолдарды нақты түрлендірудің қажеті жоқ - қажетті әрекеттердің көпшілігі кітапхананың тереңдігіне ендірілген және тек әрекет ету сигналын күтуде. 🙂 Жалпы, теру мөлдір жұмыс істейді және қол жетімді барлық дерлік кірістірілген деректер түрлерін қолдайды (мұздатылған жинақ, күрделі және байттар тексерілмеген).

Python 2-ні қолдау талабы іс жүзінде ешқандай құрбандықтарсыз орындалды (теруден және Python 3-тің соңғы нұсқаларының кейбір «қант кәмпиттерінен» бас тарту), атап айтқанда, барлық жерде алтылықтың арқасында (метакласстарды пайдалану мәселелерін шешу үшін).

Бірақ кейбір шектеулер бар:

  • Python 3 қолдауы 3.5 және одан жоғары нұсқаны білдіреді (олардың сіздің жобаңызда болуы жалқаулықтың немесе жақсартуларды қажет етпеудің нәтижесі, себебі сіз әлі де 3.4-те болуыңыздың объективті себебін табу қиын);
  • Python 2.7-де кітапхана жиынтық литералдарды сериядан шығаруды қолдамайды. Сипаттама осында. Бірақ кімде-кім оны жүзеге асырғысы келсе, қош келдіңіз :);

Кітапханада талдау қателері болған жағдайда ерекшелік механизмі де бар. Егер жолды қол жетімді анализаторлардың ешқайсысы тани алмаса, мән жол болып қалады (олай болса, ыңғайлылық және Bash жүйесінде айнымалылар жұмысының әдеттегі логикасымен кері үйлесімділік себептері бойынша).

питон-қабық кітапханасы

Енді мен сізге екінші кітапхана туралы айтып беремін (қолданыстағы аналогтардың кемшіліктерінің сипаттамасын қалдырамын - бұл smart-env үшін сипатталғанға ұқсас. Аналогтар - осында и осында).

Жалпы, іске асыру идеясы және оған қойылатын талаптар 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 әлеміндегі Bash-ті көрсететін жалғыз класс;
  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 и ППИ
  2. python-қабық кітапханасы: GitHub и ППИ
  3. Telegram арнасы кітапхана жаңартулары

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

Ақпарат көзі: www.habr.com

пікір қалдыру