ProHoster > blog > Gweinyddiaeth > Gwneud Python a Chyfeillgarwch Bash: llyfrgelloedd smart-env a python-shell
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.
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:
Dosbarth sengl sy'n cynrychioli Bash yn y byd Python;
Gelwir pob gorchymyn Bash yn swyddogaeth o'r dosbarth Shell;
Yna mae'r paramedrau ar gyfer pob galwad swyddogaeth yn cael eu trosglwyddo i'r alwad gorchymyn Bash cyfatebol;
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;
mae'n bosibl cyrchu allbwn gorchymyn yn stdout, yn ogystal â'i god dychwelyd;
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());
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.