Gwneud Python a Chyfeillgarwch Bash: llyfrgelloedd smart-env a python-shell

Diwrnod da pawb.

Heddiw, Python yw un o'r ieithoedd a ddefnyddir fwyaf yn y maes o greu nid yn unig cynhyrchion meddalwedd eu hunain, ond hefyd yn darparu eu seilwaith. O ganlyniad, bu'n rhaid i lawer o ddefodau, boed trwy eu hewyllys neu yn ei herbyn, ddysgu iaith newydd i'w defnyddio'n ddiweddarach fel atodiad i'r hen sgriptiau Bash da. Fodd bynnag, mae Bash a Python yn arddel gwahanol ddulliau o ysgrifennu cod ac mae ganddynt rai nodweddion, sy'n golygu bod trosglwyddo sgriptiau Bash i'r “iaith neidr” weithiau'n troi allan i fod yn dasg alluog ac ymhell o fod yn ddibwys.

Er mwyn gwneud bywyd yn haws i ddevops, mae llawer o lyfrgelloedd a chyfleustodau defnyddiol yn Python wedi'u creu ac yn parhau i gael eu creu. Mae'r erthygl hon yn disgrifio dwy lyfrgell newydd a grëwyd gan awdur y swydd hon - smart-env и python-cragen - ac wedi'i gynllunio i leddfu devops o'r angen i dalu llawer o sylw i gymhlethdodau gweithio gyda Python, gan adael lle ar gyfer tasgau mwy diddorol. Mae cwmpas gweithgaredd llyfrgelloedd yn newidynnau amgylchedd a lansio cyfleustodau allanol.

Unrhyw un â diddordeb, gwelwch gath.

"Beiciau" newydd?

Mae'n ymddangos, pam creu pecynnau newydd ar gyfer gweithrediadau eithaf cyffredin? Beth sy'n eich atal rhag defnyddio os.environ ac subprocess.<dull neu ddosbarth o'ch dewis> yn uniongyrchol?

Byddaf yn darparu tystiolaeth o blaid pob un o’r llyfrgelloedd ar wahân.

llyfrgell smart-env

Cyn ysgrifennu eich syniad eich hun, mae'n ddefnyddiol mynd ar-lein a chwilio am atebion parod. Wrth gwrs, mae yna risg o beidio â dod o hyd i'r hyn sydd ei angen arnoch chi, ond mae hwn yn hytrach yn “ddigwyddiad yswiriant”. Fel rheol, mae'r dull hwn yn gweithio ac yn arbed llawer o amser ac ymdrech.

Yn ôl y canlyniadau chwilio datgelwyd y canlynol:

  • mae yna becynnau sydd mewn gwirionedd yn lapio galwadau i os.environ, ond ar yr un pryd yn gofyn am griw o gamau sy'n tynnu sylw (gan greu enghraifft o ddosbarth, paramedrau arbennig mewn galwadau, ac ati);
  • Mae yna becynnau da, sydd, fodd bynnag, wedi'u cysylltu'n llym ag ecosystem benodol (fframweithiau gwe yn bennaf fel Django) ac felly nid ydynt yn gyffredinol o gwbl heb ffeil;
  • mae yna ymdrechion prin i wneud rhywbeth newydd. Er enghraifft, ychwanegu teipio a dosrannu gwerthoedd newidiol yn benodol trwy alw dulliau fel
    get_<typename>(var_name)

    Neu yma un ateb arall, nad yw, fodd bynnag, yn cefnogi'r Python 2 sydd bellach yn warthus (sydd, er gwaethaf RIP swyddogol, mae yna fynyddoedd o god ysgrifenedig ac ecosystemau cyfan o hyd);

  • Mae yna grefftau ysgol-myfyrwyr a ddaeth i ben yn y PyPI i fyny'r afon am ryw reswm anhysbys a dim ond yn creu problemau gydag enwi pecynnau newydd (yn benodol, mae'r enw "smart-env" yn fesur angenrheidiol).

A gall y rhestr hon fynd ymlaen am amser hir. Fodd bynnag, roedd y pwyntiau uchod yn ddigon i'm cyffroi ynghylch y syniad o wneud rhywbeth cyfleus a chyffredinol.

Gofynion a osodwyd cyn ysgrifennu smart-env:

  • Y cynllun defnydd mwyaf syml
  • Cefnogaeth teipio data hawdd ei ffurfweddu
  • Python 2.7 gydnaws
  • Sylw cod da gan brofion

Yn y pen draw, gwireddwyd hyn i gyd. Dyma enghraifft o ddefnydd:

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

Fel y gallwch weld o'r enghraifft, i weithio gyda dosbarth newydd, does ond angen i chi ei fewnforio (nid oes angen i chi greu enghraifft - heb y weithred ychwanegol). Cyflawnir mynediad i unrhyw newidyn amgylchedd trwy gyfeirio ato fel newidyn o'r dosbarth ENV, sydd, mewn gwirionedd, yn gwneud y dosbarth hwn yn ddeunydd lapio greddfol ar gyfer amgylchedd y system frodorol, tra ar yr un pryd yn ei droi'n wrthrych cyfluniad posibl ar gyfer bron unrhyw system ( cyflawnir dull tebyg, er enghraifft, yn Django , dim ond yno y gwrthrych ffurfweddu yw'r modiwl gosodiadau / pecyn ei hun).

Cyflawnir galluogi / analluogi'r modd cymorth teipio awtomatig gan ddefnyddio dau ddull - enable_automatic_type_cast () a disable_automatic_type_cast(). Gall hyn fod yn gyfleus os yw'r newidyn amgylchedd yn cynnwys gwrthrych cyfresol tebyg i JSON neu hyd yn oed gysonyn Boole yn unig (mae gosod y newidyn DEBUG yn benodol yn Django trwy gymharu'r newidyn amgylchedd â llinynnau “dilys” yn un o'r achosion mwyaf cyffredin). Ond nawr nid oes angen trosi llinynnau'n benodol - mae'r rhan fwyaf o'r camau angenrheidiol eisoes wedi'u hymgorffori yn nyfnderoedd y llyfrgell ac yn aros am signal i weithredu. 🙂 Yn gyffredinol, mae teipio yn gweithio'n dryloyw ac yn cefnogi bron pob math o ddata adeiledig sydd ar gael (ni phrofwyd set rew, cymhleth a beit).

Gweithredwyd y gofyniad i gefnogi Python 2 heb fawr ddim aberth (rhoi'r gorau i deipio a rhai o'r “candies siwgr" o'r fersiynau diweddaraf o Python 3), yn arbennig, diolch i'r chwech hollbresennol (i ddatrys y problemau o ddefnyddio metaclasses ).

Ond mae rhai cyfyngiadau:

  • Mae cefnogaeth Python 3 yn golygu fersiwn 3.5 ac uwch (mae eu presenoldeb yn eich prosiect yn ganlyniad naill ai diogi neu ddiffyg angen am welliannau, gan ei bod yn anodd dod o hyd i reswm gwrthrychol pam eich bod yn dal ar 3.4);
  • Yn Python 2.7, nid yw'r llyfrgell yn cefnogi dad-gyfrifo llythrenau gosod. Disgrifiad yma. Ond os oes unrhyw un am ei weithredu, mae croeso i chi :);

Mae gan y llyfrgell hefyd fecanwaith eithrio rhag ofn y bydd gwallau dosrannu. Os na allai unrhyw un o'r dadansoddwyr sydd ar gael adnabod y llinyn, mae'r gwerth yn parhau i fod yn llinyn (yn hytrach, am resymau cyfleustra a chydnawsedd yn ôl â'r rhesymeg arferol o sut mae newidynnau'n gweithio yn Bash).

llyfrgell python-cragen

Nawr dywedaf wrthych am yr ail lyfrgell (byddaf yn hepgor y disgrifiad o ddiffygion y analogau presennol - mae'n debyg i'r hyn a ddisgrifir ar gyfer smart-env. Analogau - yma и yma).

Yn gyffredinol, mae'r syniad o weithredu a'r gofynion ar ei gyfer yn debyg i'r rhai a ddisgrifir ar gyfer smart-env, fel y gwelir o'r enghraifft:

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

Y syniad yw hyn:

  1. Dosbarth sengl sy'n cynrychioli Bash yn y byd Python;
  2. Gelwir pob gorchymyn Bash yn swyddogaeth o'r dosbarth Shell;
  3. Yna mae'r paramedrau ar gyfer pob galwad swyddogaeth yn cael eu trosglwyddo i'r alwad gorchymyn Bash cyfatebol;
  4. Mae pob gorchymyn yn cael ei weithredu “yma ac yn awr” ar hyn o bryd fe'i gelwir, h.y. mae'r dull cydamserol yn gweithio;
  5. mae'n bosibl cyrchu allbwn gorchymyn yn stdout, yn ogystal â'i god dychwelyd;
  6. Os nad yw'r gorchymyn yn y system, caiff eithriad ei daflu.

Fel gyda smart-env, mae cefnogaeth i Python 2 (er bod angen ychydig mwy o waed aberthol) a dim cefnogaeth i Python 3.0-3.4.

Cynlluniau datblygu llyfrgell

Gallwch ddefnyddio'r llyfrgelloedd nawr: mae'r ddau yn cael eu postio ar y PyPI swyddogol. Mae ffynonellau ar gael ar Github (gweler isod).

Bydd y ddwy lyfrgell yn cael eu datblygu gan ystyried adborth a gasglwyd gan y rhai sydd â diddordeb. Ac, os gall fod yn anodd meddwl am amrywiaeth o nodweddion newydd yn smart-env, yna yn python-shell yn bendant mae rhywbeth arall i'w ychwanegu:

  • cefnogaeth ar gyfer galwadau nad ydynt yn rhwystro;
  • posibilrwydd o gyfathrebu rhyngweithiol gyda'r tîm (gweithio gyda stdin);
  • ychwanegu eiddo newydd (er enghraifft, eiddo i dderbyn allbwn o stderr);
  • gweithredu cyfeiriadur o orchmynion sydd ar gael (i'w ddefnyddio gyda'r swyddogaeth dir());
  • ac ati

cyfeiriadau

  1. llyfrgell smart-env: Github и PyPI
  2. llyfrgell python-cragen: Github и PyPI
  3. Sianel Telegram diweddariadau llyfrgell

UPD 23.02.2020/XNUMX/XNUMX:
* Mae ystorfeydd wedi'u symud, mae dolenni cyfatebol wedi'u diweddaru
* Fersiwn python-shell ==1.0.1 yn cael ei baratoi i'w ryddhau ar 29.02.2020/XNUMX/XNUMX. Mae'r newidiadau'n cynnwys cefnogaeth ar gyfer awtolenwi'r gorchymyn a'r gorchymyn dir(Shell), rhedeg gorchmynion gyda dynodwr Python annilys, ac atgyweiriadau nam.

Ffynhonnell: hab.com

Ychwanegu sylw