БъздаванС Π½Π° приятСлство ΠΌΠ΅ΠΆΠ΄Ρƒ Python ΠΈ Bash: Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ smart-env ΠΈ python-shell

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

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

Π—Π° Π΄Π° улСснят ΠΆΠΈΠ²ΠΎΡ‚Π° Π½Π° devops, бяха създадСни ΠΈ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°Ρ‚ Π΄Π° сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Π² Python. Π’Π°Π·ΠΈ статия описва Π΄Π²Π΅ Π½ΠΎΠ²ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, създадСни ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€Π° Π½Π° Ρ‚Π°Π·ΠΈ публикация - smart-env ΠΈ python-shell - ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈ Π΄Π° ΠΎΠ±Π»Π΅ΠΊΡ‡Π°Ρ‚ 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-ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΎΠ±Π΅ΠΊΡ‚ ΠΈΠ»ΠΈ Π΄ΠΎΡ€ΠΈ само Π±ΡƒΠ»Π΅Π²Π° константа (ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΎΡ‚ΠΎ Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° DEBUG Π² Django Ρ‡Ρ€Π΅Π· сравняванС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° Π½Π° срСдата с β€žΠ²Π°Π»ΠΈΠ΄Π½ΠΈβ€œ Π½ΠΈΠ·ΠΎΠ²Π΅ Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°ΠΉ-чСститС случаи). Но сСга няма Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅ - ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΎΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ дСйствия Π²Π΅Ρ‡Π΅ са Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ Π² Π΄ΡŠΠ»Π±ΠΈΠ½ΠΈΡ‚Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΠΈ просто Ρ‡Π°ΠΊΠ°Ρ‚ сигнал Π·Π° дСйствиС. πŸ™‚ ΠšΠ°Ρ‚ΠΎ цяло Π²ΡŠΠ²Π΅ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ ΠΈ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΏΠΎΡ‡Ρ‚ΠΈ всички Π½Π°Π»ΠΈΡ‡Π½ΠΈ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ (frozenset, complex ΠΈ bytes Π½Π΅ са тСствани).

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

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

  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° 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')  # 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. Π•Π΄ΠΈΠ½ клас, ΠΊΠΎΠΉΡ‚ΠΎ прСдставлява 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);
  • добавянС Π½Π° Π½ΠΎΠ²ΠΈ свойства (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ свойство Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄ ΠΎΡ‚ 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 ΠΈ ΠΊΠΎΡ€Π΅ΠΊΡ†ΠΈΠΈ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€