Π‘Π΄Ρ€ΡƒΠΆΠ°Π²Π°ΠΌΠ΅ Python ΠΈ Bash: Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ smart-env ΠΈ python-shell

Π”ΠΎΠ±ΡŠΡ€ Π΄Π΅Π½ Π½Π° всички.

Π’ днСшно Π²Ρ€Π΅ΠΌΠ΅ Python Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°ΠΉ-ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡ‚Π΅ Π΅Π·ΠΈΡ†ΠΈ Π² сфСрата Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π΅ само Π½Π° софтуСрни ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈ, Π½ΠΎ ΠΈ Π½Π° инфраструктурата ΠΈΠΌ. ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ дСвопс спСциалисти, нСзависимо Π΄Π°Π»ΠΈ искат ΠΈΠ»ΠΈ Π½Π΅, Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° Π½Π°ΡƒΡ‡Π°Ρ‚ Π½ΠΎΠ² Π΅Π·ΠΈΠΊ, Π·Π° Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π² допълнСниС Π½Π° старитС Π΄ΠΎΠ±Ρ€ΠΈ Bash скриптовС. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Bash ΠΈ Python ΠΈΠΌΠ°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈ към написванСто Π½Π° ΠΊΠΎΠ΄ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ характСристики, ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€Π΅Π½ΠΎΡΡŠΡ‚ Π½Π° Bash скриптовС Π½Π° β€žΠ·ΠΌΠ΅ΠΉΡΠΊΠΈΡ Π΅Π·ΠΈΠΊβ€œ понякога сС ΠΎΠΊΠ°Π·Π²Π° слоТна ΠΈ Π΄Π°Π»Π΅Ρ‡ Π½Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»Π½Π° Π·Π°Π΄Π°Ρ‡Π°.

Π—Π° Π΄Π° ΠΎΠ±Π»Π΅ΠΊΡ‡Π°Ρ‚ ΠΆΠΈΠ²ΠΎΡ‚Π° Π½Π° дСвопс спСциалиститС, са създадСни ΠΈ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°Ρ‚ Π΄Π° сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΈ Π½Π° Python. Настоящата статия описва Π΄Π²Π΅ Π½ΠΎΠ²ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, създадСни ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€Π° Π½Π° Ρ‚ΠΎΠ·ΠΈ пост β€” smart-env ΠΈ python-shell β€” ΠΊΠΎΠΈΡ‚ΠΎ цСлят Π΄Π° освободят дСвопс спСциалиститС ΠΎΡ‚ нСобходимостта Π΄Π° отдСлят ΠΌΠ½ΠΎΠ³ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄Π΅Ρ‚Π°ΠΉΠ»ΠΈΡ‚Π΅ ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с Python, оставяйки пространство Π·Π° ΠΏΠΎ-интСрСсни Π·Π°Π΄Π°Ρ‡ΠΈ. ΠžΠ±Π»Π°ΡΡ‚Ρ‚Π° Π½Π° дСйствиС Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ Π΅ Ρ€Π°Π±ΠΎΡ‚Π° с ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата ΠΈ стартиранС Π½Π° външни ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΈ.

ΠšΠΎΠΉΡ‚ΠΎ сС интСрСсува, моля Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ Π½Π°Π΄ΠΎΠ»Ρƒ.

Нови β€žΠ²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄ΠΈβ€œ?

ИзглСТда, Ρ‡Π΅ няма смисъл Π΄Π° сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ Π½ΠΎΠ²ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π·Π° Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ? Какво ΠΏΡ€Π΅Ρ‡ΠΈ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ os.environ ΠΈ subprocess.?

ДоказатСлства Π² ΠΏΠΎΠ»Π·Π° Π½Π° всяка ΠΎΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ Ρ‰Π΅ прСдставя ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° smart-env

ΠŸΡ€Π΅Π΄ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅ собствСното си Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈΠ΅, Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π° сС ΠΏΠΎΡ€Π°Π·Ρ€ΠΎΠ²ΠΈΡ‚Π΅ Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΈ Π΄Π° ΠΏΠΎΡ‚ΡŠΡ€ΡΠΈΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΈΠΌΠ° риск Π΄Π° Π½Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, ΠΎΡ‚ ΠΊΠΎΠ΅Ρ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚Π΅, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π΅ ΠΏΠΎ-скоро β€žΡΡ‚Ρ€Π°Ρ…ΠΎΠ² ΡΠ»ΡƒΡ‡Π°ΠΉβ€œ. ОбикновСно ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡŠΡ‚ сработва ΠΈ спСстява ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅ ΠΈ усилия.

Π‘ΠΏΠΎΡ€Π΅Π΄ ΠΏΠΎ исканС Π½Π° бСшС установСно слСдното:

  • ΠΈΠΌΠ° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ наистина ΠΎΠ±Π²ΠΈΠ²Π°Ρ‚ извикванията към os.environ, Π½ΠΎ изискват ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π»Π΅Ρ‡Π΅Π½ΠΈ дСйствия (създаванС Π½Π° СкзСмпляр Π½Π° клас, спСциални ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π² извикванията ΠΈ Π΄Ρ€.);
  • ΠΈΠΌΠ° Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΎΠ±Π°Ρ‡Π΅ са Π·Π΄Ρ€Π°Π²ΠΎ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° СкосистСма (Π³Π»Π°Π²Π½ΠΎ с ΡƒΠ΅Π± Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€Ρ†ΠΈ ΠΊΠ°Ρ‚ΠΎ Django) ΠΈ Π·Π°Ρ‚ΠΎΠ²Π° Π±Π΅Π· наковалня Π½Π΅ са съвсСм унивСрсални;
  • ΠΈΠΌΠ° Ρ€Π΅Π΄ΠΊΠΈ ΠΎΠΏΠΈΡ‚ΠΈ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½Π΅Ρ‰ΠΎ Π½ΠΎΠ²ΠΎ. НапримСр, Π΄Π° сС Π΄ΠΎΠ±Π°Π²ΠΈ типизация ΠΈ явно Π΄Π° сС парсват стойноститС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Ρ‡Ρ€Π΅Π· ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΎΡ‚ Π²ΠΈΠ΄Π°
    get_(ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π°)

    Или Π΅Ρ‚ΠΎ ΠΎΡ‰Π΅ Π΅Π΄Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ±Π°Ρ‡Π΅ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π²Π΅Ρ‡Π΅ остарСлия Python 2 (Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ ΠΈΠΌΠ° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π΅Π½ R.I.P., всС ΠΎΡ‰Π΅ остават ΠΊΡƒΠΏΠΈΡ‰Π° написан ΠΊΠΎΠ΄ ΠΈ Ρ†Π΅Π»ΠΈ СкосистСми);

  • ΠΈΠΌΠ° ΡƒΡ‡ΠΈΠ»ΠΈΡ‰Π½ΠΈ-студСнски ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ напълно нСпонятно Π·Π° ΠΊΠ°ΠΊΠ²ΠΎ сС ΠΎΠΊΠ°Π·Π°Ρ…Π° Π² upstream PyPI ΠΈ само ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π½ΠΎΠ²ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ (Π² частност, ΠΈΠΌΠ΅Ρ‚ΠΎ β€žsmart-envβ€œ Π΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»Π½Π° мярка).

И Ρ‚ΠΎΠ·ΠΈ списък ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ дълго. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, ΠΈ ΠΈΠ·Π±Ρ€ΠΎΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠΎ-Π³ΠΎΡ€Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ бяха Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΈ, Π·Π° Π΄Π° сС запаля идСята Π΄Π° направя Π½Π΅Ρ‰ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ унивСрсално.

Π˜Π·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΡ‚Π°, ΠΊΠΎΠΈΡ‚ΠΎ бяха поставСни ΠΏΡ€Π΅Π΄ написванСто Π½Π° smart-env:

  • Максимално проста схСма Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅
  • ЛСсна Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° типизация Π½Π° Π΄Π°Π½Π½ΠΈ
  • Π‘ΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ с Python 2.7
  • Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΊΡ€ΠΈΡ‚ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄Π° с тСстовС

Π’ ΠΊΡ€Π°ΠΉΠ½Π° смСтка, всичко Ρ‚ΠΎΠ²Π° бСшС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ. Π•Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°:

from smart_env import ENV

print(ENV.HOME)  # Π Π°Π²Π½ΠΎ Π½Π° print(os.environ['HOME'])

# ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΠΉΠΊΠΈ, Ρ‡Π΅ стС Π·Π°Π΄Π°Π»ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° Π½Π° срСда MYVAR Π½Π° "True"

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # Π Π°Π²Π½ΠΎ Π½Π° Π±ΡƒΠ»Π΅Π²ΠΎ True

ENV.NEW_VAR = 100  # Π—Π°Π΄Π°Π²Π° Π½ΠΎΠ²Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° срСда

ΠšΠ°ΠΊΡ‚ΠΎ сС Π²ΠΈΠΆΠ΄Π° ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с новия клас Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ просто Π΄Π° Π³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π½Π΅Ρ‚Π΅ (Π½Π΅ Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π° ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ инстанция β€” ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ излишно дСйствиС). Π”ΠΎΡΡ‚ΡŠΠΏΡŠΡ‚ Π΄ΠΎ всяка ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° срСда сС постига Ρ‡Ρ€Π΅Π· ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ към нСя ΠΊΠ°Ρ‚ΠΎ към ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° класа ENV, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ·ΠΈ клас ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΠ° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π½Π° Π½Π°Ρ‚ΠΈΠ²Π½Π°Ρ‚Π° систСмна срСда, ΠΊΠ°Ρ‚ΠΎ ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ я ΠΏΡ€Π΅Π²Ρ€ΡŠΡ‰Π° Π² възмоТСн Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ ΠΎΠ±Π΅ΠΊΡ‚ практичСски всяка систСма (ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сС постига Π² Django, само Ρ‡Π΅ Ρ‚Π°ΠΌ конфигурационният ΠΎΠ±Π΅ΠΊΡ‚ Π΅ самият ΠΌΠΎΠ΄ΡƒΠ»/ΠΏΠ°ΠΊΠ΅Ρ‚ settings).

Π’ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅Ρ‚ΠΎ/ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½Π° типизация сС постига Ρ‡Ρ€Π΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° β€” enable_automatic_type_cast() ΠΈ disable_automatic_type_cast(). Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π°ΠΊΠΎ Π² ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° Π½Π° срСда ΠΈΠΌΠ° сСриализиран JSON-ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΎΠ±Π΅ΠΊΡ‚ ΠΈΠ»ΠΈ Π΄ΠΎΡ€ΠΈ просто Π±ΡƒΠ»Π΅Π²Π° константа (явното ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° DEBUG Π² Django Ρ‡Ρ€Π΅Π· сравнСниС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° Π½Π° срСда с β€žΠ΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΈΡ‚Π΅β€œ Π½ΠΈΠ·ΠΎΠ²Π΅ β€” Π΅Π΄ΠΈΠ½ ΠΎΡ‚ чСсто срСщанитС случаи). Но сСга няма Π½ΡƒΠΆΠ΄Π° Π΄Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°Ρ‚Π΅ Π½ΠΈΠ·ΠΎΠ²Π΅Ρ‚Π΅ Ρ€ΡŠΡ‡Π½ΠΎ β€” ΠΏΠΎ-голямата част ΠΎΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ дСйствия Π²Π΅Ρ‡Π΅ са Π·Π°Π»ΠΎΠΆΠ΅Π½ΠΈ Π² Π½Π΅Π΄Ρ€Π°Ρ‚Π° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΠΈ само Ρ‡Π°ΠΊΠ°Ρ‚ сигнал Π·Π° дСйствиС. πŸ™‚ Π’ ΠΎΠ±Ρ‰ΠΈ Π»ΠΈΠ½ΠΈΠΈ, типизацията Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ ΠΈ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΏΠΎΡ‡Ρ‚ΠΈ всички Π½Π°Π»ΠΈΡ‡Π½ΠΈ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ (Π½Π΅ са тСствани frozenset, complex ΠΈ bytes).

Π˜Π·ΠΈΡΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π·Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Python 2 бСшС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ практичСски Π±Π΅Π· ΠΆΠ΅Ρ€Ρ‚Π²ΠΈ (ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ typing ΠΈ някои β€žΠ±ΠΎΠ½Π±ΠΎΠ½Ρ‡Π΅Ρ‚Π°β€œ ΠΎΡ‚ послСднитС вСрсии Python 3), Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° ΡˆΠΈΡ€ΠΎΠΊΠΎΡ€Π°Π·ΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½ΠΈΡ six (Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° мСтакласовС).

Но ΠΈΠΌΠ° ΠΈ някои ограничСния:

  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° Python 3 изисква вСрсия 3.5 ΠΈ ΠΏΠΎ-висока (Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ ΠΈΠΌ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²ΠΈ Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΈΠ»ΠΈ ΠΎΡ‚ ΠΌΡŠΡ€Π·Π΅Π», ΠΈΠ»ΠΈ ΠΎΡ‚ липса Π½Π° Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ подобрСния, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС измисли ΠΎΠ±Π΅ΠΊΡ‚ΠΈΠ²Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎΡ€Π°Π΄ΠΈ която всС ΠΎΡ‰Π΅ Π΄Π° сСдитС Π½Π° 3.4);
  • Π’ Python 2.7 Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° дСсСриализация Π½Π° Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΈ ΠΎΡ‚ мноТСства. ОписаниС Ρ‚ΡƒΠΊ. Но, Π°ΠΊΠΎ някой иска Π΄Π° я Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° – Π΄ΠΎΠ±Ρ€Π΅ дошъл:);

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° слСдва ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² случай Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΏΡ€ΠΈ парсиранС. Ако Π½ΠΈΠ·ΡŠΡ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Ρ‚ ΠΎΡ‚ Π½ΠΈΡ‚ΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΈ, стойността остава Π½ΠΈΠ·ΠΎΠ²Π° (ΠΏΠΎ-скоро ΠΎΡ‚ ΡΡŠΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ Π·Π° удобство ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½Π° ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ с ΠΏΠΎΠ·Π½Π°Ρ‚Π°Ρ‚Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π² Bash).

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° python-shell

Π‘Π΅Π³Π° Ρ‰Π΅ Π²ΠΈ Ρ€Π°Π·ΠΊΠ°ΠΆΠ° Π·Π° Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° (описаниСто Π½Π° Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈΡ‚Π΅ Π½Π° Π½Π°Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ Π°Π½Π°Π»ΠΎΠ·ΠΈ пропускам – Ρ‚ΠΎ Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° описаното Π·Π° smart-env. АналозитС – Ρ‚ΡƒΠΊ ΠΈ Ρ‚ΡƒΠΊ).

ΠšΠ°Ρ‚ΠΎ цяло, идСята Π·Π° рСализация ΠΈ изискванията към нСя са Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΈ Π½Π° описанитС Π·Π° smart-env, ΠΊΠΎΠ΅Ρ‚ΠΎ сС Π²ΠΈΠΆΠ΄Π° ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

from python_shell import Shell

Shell.ls('-l', '$HOME')  # Π Π°Π²Π½ΠΎ Π½Π° "ls -l $HOME"

command = Shell.whoami()  # Π Π°Π²Π½ΠΎ Π½Π° "whoami"
print(command.output)  # ΠΏΡ€ΠΈΠ½Ρ‚ΠΈΡ€Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° тСкущия ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»

print(command.command)  # ΠΏΡ€ΠΈΠ½Ρ‚ΠΈΡ€Π° "whoami"
print(command.return_code)  # ΠΏΡ€ΠΈΠ½Ρ‚ΠΈΡ€Π° "0"
print(command.arguments)  # ΠΏΡ€ΠΈΠ½Ρ‚ΠΈΡ€Π° ""

Shell.mkdir('-p', '\/tmp\/new_folder')  # създава нова папка

Π˜Π΄Π΅ΡΡ‚Π° Π΅ слСдната:

  1. Π•Π΄ΠΈΠ½Π΅Π½ клас, олицСтворяващ Bash Π² свСта Π½Π° 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);
  • добавянС Π½Π° Π½ΠΎΠ²ΠΈ свойства (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, property Π·Π° ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π° ΠΎΡ‚ stderr);
  • рСализация Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с Π½Π°Π»ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ (Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ с функцията dir());
  • ΠΈ Ρ‚.Π½.

Π’Ρ€ΡŠΠ·ΠΊΠΈ

  1. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° smart-env: Github ΠΈ PyPI
  2. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° python-shell: Github ΠΈ PyPI
  3. Π’Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π» Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅

UPD 23.02.2020:
* Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈΡ‚Π΅ са прСмСстСни, ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ Π²Ρ€ΡŠΠ·ΠΊΠΈ са Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ
* ВСрсия python-shell==1.0.1 Π΅ Π² процСс Π½Π° ΠΈΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° 29.02.2020. Π‘Ρ€Π΅Π΄ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ β€” ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ допълванС Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° dir(Shell), стартиранС Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ с Π½Π΅Π²Π°Π»ΠΈΠ΄Π΅Π½ Python ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΏΠΎΠΏΡ€Π°Π²ΠΊΠ° Π½Π° бъговС.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster