Π‘Π΄Ρ€ΡƒΠΆΠΈΠ²Π°Π΅ΠΌ 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_<typename>(var_name)

    Или Π²ΠΎΡ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Ρ‹Π½Π΅ ΠΎΠΏΠ°Π»ΡŒΠ½Ρ‹ΠΉ Python 2 (Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ, нСсмотря Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ R.I.P., всС Π΅Ρ‰Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π³ΠΎΡ€Ρ‹ написанного ΠΊΠΎΠ΄Π° ΠΈ Ρ†Π΅Π»Ρ‹Π΅ экосистСмы);

  • Π΅ΡΡ‚ΡŒ школьно-студСнчСскиС ΠΏΠΎΠ΄Π΅Π»ΠΊΠΈ, Π²ΠΎΠΎΠ±Ρ‰Π΅ нСпонятно Π·Π°Ρ‡Π΅ΠΌ оказавшиСся Π² апстримном 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, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π°ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ выступаСт нСпосрСдствСнно ΠΌΠΎΠ΄ΡƒΠ»ΡŒ/ΠΏΠ°ΠΊΠ΅Ρ‚ 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 Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² мноТСств. ОписаниС Ρ‚ΡƒΡ‚. Но, Ссли ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ β€” welcome:);

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ‚Π°ΠΊΠΆΠ΅ исповСдуСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π½Π° случай ошибок парсинга. Если строку Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ остаСтся строковым (скорСС, ΠΈΠ· сообраТСний удобства ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости с ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² 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);
  • Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… свойств (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ