рдкрд╛рдпрдерди рдЖрдгрд┐ рдмреЕрд╢ рдлреНрд░реЗрдВрдбрд╢рд┐рдк рдмрдирд╡рдгреЗ: рдкрд╛рдпрдерди-рд╢реЗрд▓ рдЖрдгрд┐ рд╕реНрдорд╛рд░реНрдЯ-рдПрдирд╡реНрд╣реА рд▓рд╛рдпрдмреНрд░рд░реАрдЪреЗ рдкреНрд░рдХрд╛рд╢рди. рез.реж.рез

рд╕рд░реНрд╡рд╛рдВрдирд╛ рд╢реБрдн рджрд┐рд╡рд╕!

29 рдлреЗрдмреНрд░реБрд╡рд╛рд░реА 2020 рд╡рд░реНрд╖реЗ рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдВрдЪреЗ рдЕрдзрд┐рдХреГрдд рд╕реВрдХреНрд╖реНрдо рдкреНрд░рдХрд╛рд╢рди рдЭрд╛рд▓реЗ smart-env ╨╕ рдЕрдЬрдЧрд░-рд╢реЗрд▓. рдЬреНрдпрд╛рдВрдирд╛ рдорд╛рд╣рд┐рддреА рдирд╛рд╣реА рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдореА рд╕реБрдЪрд╡рд┐рддреЛ рдХреА рддреБрдореНрд╣реА рддреЗ рдЖрдзреА рд╡рд╛рдЪрд╛ рдкрд╣рд┐рд▓реА рдкреЛрд╕реНрдЯ.

рдереЛрдбрдХреНрдпрд╛рдд, рдмрджрд▓рд╛рдВрдордзреНрдпреЗ рдХрдорд╛рдВрдб рдкреВрд░реНрдг рдХрд░рдгреЗ, рдХрдорд╛рдВрдб рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪреА рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХреНрд╖рдорддрд╛, рдХрд╛рд╣реА рд░рд┐рдлреЕрдХреНрдЯрд░рд┐рдВрдЧ рдЖрдгрд┐ рдмрдЧ рдлрд┐рдХреНрд╕ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗрдд.

рддрдкрд╢реАрд▓рд╛рдВрд╕рд╛рдареА рдХреГрдкрдпрд╛ рдорд╛рдВрдЬрд░ рдкрд╣рд╛.

рдкрд╛рдпрдерди-рд╢реЗрд▓рдордзреНрдпреЗ рдирд╡реАрди рдХрд╛рдп рдЖрд╣реЗ?

рдореА рд▓рдЧреЗрдЪ рдорд┐рд╖реНрдЯрд╛рдиреНрди рд╕реБрд░реВ рдХрд░реЗрди.

рдЖрджреЗрд╢ рдкреВрд░реНрдг

рд╕рд╣рдордд рдЖрд╣реЗ - рдЬреЗрд╡реНрд╣рд╛ рд╕рдВрдкрд╛рджрдХ/рдЖрдпрдбреАрдИ/рдЯрд░реНрдорд┐рдирд▓ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрдорд╛рдВрдбрдЪреНрдпрд╛ рдирд╛рд╡рд╛рд╕рд╛рдареА рдЖрдгрд┐ рдХрдзреАрдХрдзреА рдХреЙрд▓ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╕рд╛рдареА рдкреНрд░реЙрдореНрдкреНрдЯ рдХрд░рддреЗ рддреЗрд╡реНрд╣рд╛ рддреЗ рд╕реЛрдпреАрд╕реНрдХрд░ рдЕрд╕рддреЗ? рддреНрдпрд╛рдореБрд│реЗ рдкрд╛рдпрдерди-рд╢реЗрд▓ рд╣рд│реВрд╣рд│реВ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рдд рдкреНрд░рдЧрддреА рдХрд░рдд рдЖрд╣реЗ. рд╣реВрдб рдЕрдВрддрд░реНрдЧрдд рд╢реЗрд▓ рд╡рд░реНрдЧрд╛рдЪреА рдлреАрд▓реНрдб рддреНрдпрд╛рдЪреНрдпрд╛ рдлреАрд▓реНрдб (рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА __getattr__) рдирд╕реВрди рдбреА-рдлреЕрдХреНрдЯреЛ рдЕрд╕рд▓реНрдпрд╛рдореБрд│реЗ, рд╕реНрд╡рдпрдВрдкреВрд░реНрдгрддрд╛ рджреЗрдЦреАрд▓ рд╕реБрд░рд╡рд╛рддреАрдкрд╛рд╕реВрди рддрдпрд╛рд░ рдХреЗрд▓реА рдЧреЗрд▓реА (рдЕрдиреБрдХреНрд░рдореЗ __dir__ рдкрджреНрдзрдд рдУрд╡реНрд╣рд░рд▓реЛрдб рдХрд░реВрди). рд╕реНрд╡рдпрдВрдкреВрд░реНрдгрддрд╛ рд╕рдзреНрдпрд╛ BPython рдЖрдгрд┐ IPython рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдХрд╛рд░реНрдп рдХрд░рддреЗ. рдЕрд░реНрдерд╛рдд, рдореА PyCharm рд╕рд╛рд░рдЦреНрдпрд╛ рдЕрдзрд┐рдХ рдЖрджрд░рдгреАрдп рдЙрддреНрдкрд╛рджрдирд╛рдВрд╕рд╣ рдПрдХреАрдХрд░рдг рдкрд╛рд╣реВ рдЗрдЪреНрдЫрд┐рддреЛ рдЖрдгрд┐ рдпрд╛ рджрд┐рд╢реЗрдиреЗ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреНрдпрд╛ рд╢рдХреНрдпрддрд╛рдВрдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХреЗрд▓рд╛ рдЬрд╛рдд рдЖрд╣реЗ.

рдЧреБрдгрдзрд░реНрдо рдЬреЛрдбрдд рдЖрд╣реЗ

рд░рд┐рд▓реАрдЭрдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди, рд╢реЗрд▓ рдХреНрд▓рд╛рд╕рд▓рд╛ рдирд╡реАрди рд▓рд╛рд╕реНрдЯ_рдХрдорд╛рдВрдб рдЧреБрдгрдзрд░реНрдо рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реЗ. рдпрд╛рдЪреА рдЧрд░рдЬ рдирд┐рд░реНрдорд╛рдг рдЭрд╛рд▓реА рдХрд╛рд░рдг рдЬреЗрд╡реНрд╣рд╛ ShellException рджреНрд╡рд╛рд░реЗ рдиреЙрди-рдЭрд┐рд░реЛ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХрдорд╛рдВрдбрдиреЗ рдлреЗрдХрд▓реЗ рд╣реЛрддреЗ, рддреЗрд╡реНрд╣рд╛ рдХрдорд╛рдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ __call__() рдХреЙрд▓рд╡рд░реВрди рдХрдорд╛рдВрдб рдСрдмреНрдЬреЗрдХреНрдЯрд▓рд╛ рдкрд░рдд рдХреЗрд▓реЗ рдЬрд╛рдд рдирд╛рд╣реА. рдЖрддрд╛ рд╣реЗ рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рдЖрд╣реЗ:

try:
    command = Shell.touch('/foo.txt')
except ShellException:
    command = Shell.last_command

рдХрдорд╛рдВрдб рдСрдмреНрдЬреЗрдХреНрдЯрдЪреНрдпрд╛ рдЧреБрдгрдзрд░реНрдорд╛рдВрдЪреА рдпрд╛рджреА рджреЗрдЦреАрд▓ рд╡рд┐рд╕реНрддреГрдд рдЭрд╛рд▓реА рдЖрд╣реЗ. рддреНрд░реБрдЯреА рдлреАрд▓реНрдб рдЬреЛрдбрд▓реЗ рдЬреЗ рддреНрд░реБрдЯреА рдкреНрд░рд╡рд╛рд╣рд╛рдд рдХрдорд╛рдВрдб рдЖрдЙрдЯрдкреБрдЯ рдкрд░рдд рдХрд░рддреЗ.

рдЕрд╡реИрдз рдкрд╛рдпрдерди рдирд╛рд╡рд╛рдВрд╕рд╣ рдЖрджреЗрд╢ рдЪрд╛рд▓рд╡рдгреЗ

рдЬрд╡рд│рдЬрд╡рд│ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд╕реНрдЯрдордордзреНрдпреЗ рдХрд┐рдорд╛рди рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрд╕рддреЛ рдЬреНрдпрд╛рдЪреЗ рдирд╛рд╡ рдкрд╛рдпрдердирдордзреНрдпреЗ рдУрд│рдЦрдХрд░реНрддрд╛ рдореНрд╣рдгреВрди рдпреЛрдЧреНрдп рдирд╛рд╣реА (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕реБрдкреНрд░рд╕рд┐рджреНрдз 2to3 рдЙрдкрдпреБрдХреНрддрддрд╛). рддрд┐рд▓рд╛ рд╕реЛрдмрдд рдмреЛрд▓рд╡рд╛

Shell.2to3()

рдЬрд░ рддреЗ рдХрд╛рдо рдХрд░рдд рдирд╕реЗрд▓, рддрд░ рджреБрднрд╛рд╖реА рддреЗ рдХрд░реВ рджреЗрдгрд╛рд░ рдирд╛рд╣реА.
рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ рдХрдорд╛рдВрдбрд▓рд╛ рд░рд╛рдЙрдВрдбрдЕрдмрд╛рдЙрдЯ рдорд╛рд░реНрдЧрд╛рдиреЗ рдХреЙрд▓ рдХрд░рдгреЗ:

Shell("2to3")  # ╨▓╨╛╨╖╨▓╤А╨░╤Й╨░╨╡╤В ╨╛╨▒╤К╨╡╨║╤В ╨║╨╛╨╝╨░╨╜╨┤╤Л

рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ рдХреА рддреНрдпрд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рддреБрдореНрд╣реА рджреБрднрд╛рд╖реНрдпрд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди рд╡реИрдз рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЖрдЬреНрдЮрд╛ рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛, рдЬреНрдпрд╛рдореБрд│реЗ рд▓рд╡рдЪрд┐рдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рдорд┐рд│рддреЗ.

cmd = "python{}".format(sys.version_info[0])
Shell(cmd)(*args, **kwargs)

рдХрд┐рд░рдХреЛрд│ рдмрджрд▓

  • рдХрдорд╛рдВрдб рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯрдЪреНрдпрд╛ __repr__() рдЖрдгрд┐ __str__() рдкрджреНрдзрддреА рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд, рдЬреНрдпрд╛ рдЖрддрд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рдиреА рдореВрд▓реНрдпреЗ (рдЕрдиреБрдХреНрд░рдореЗ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ stdout рдЖрдЙрдЯрдкреБрдЯ рдЕрд╕рд▓реЗрд▓реА рдХрдорд╛рдВрдб) рддрдпрд╛рд░ рдХрд░рддрд╛рдд.
  • рдХрд┐рд░рдХреЛрд│ рдХреЛрдб рдирд┐рд░рд╛рдХрд░рдгреЗ.
  • рдЪрд╛рдЪрдгреА рдХрд╡реНрд╣рд░реЗрдЬ рдЬреЛрдбрдгреЗ, рддрд╕реЗрдЪ рд╡рд┐рджреНрдпрдорд╛рди рдкреБрдирд░реНрд░рдЪрдирд╛ рдХрд░рдгреЗ.
  • рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ рдЖрдгрд┐ рдкреНрд░реЛрд╕реЗрд╕ рдХреНрд▓рд╛рд╕реЗрд╕ рдЬреЛрдбрдгреЗ, рдЬреНрдпрд╛рдЪрд╛ рдЙрджреНрджреЗрд╢ рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ рдореЙрдбреНрдпреВрд▓рд╕рд╣ тАЛтАЛрдХрд╛рд░реНрдп рдХрд░рддрд╛рдирд╛ рдЕреЕрдмреНрд╕реНрдЯреНрд░реЕрдХреНрд╢рдирдЪреА рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╛рддрд│реА рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╣реЗ. Python 2/3 рд╕рд╣ рдХрд╛рдо рдХрд░рддрд╛рдирд╛ рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрд╢рди рджреВрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореБрдЦреНрдпрддрдГ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдкрд░рдВрддреБ рд╕рдВрднрд╛рд╡реНрдпрддрдГ рдЗрддрд░ рдмреЛрдирд╕ рджреЗрдЦреАрд▓ рдкреНрд░рджрд╛рди рдХрд░реВ рд╢рдХрддрд╛рдд.

smart-env рдордзреНрдпреЗ рдирд╡реАрди рдХрд╛рдп рдЖрд╣реЗ?

рдкрд╛рдпрдерди-рд╢реЗрд▓рдЪреНрдпрд╛ рд╡рд┐рдкрд░реАрдд, рд╕реНрдорд╛рд░реНрдЯ-рдПрдирд╡реНрд╣реА рд▓рд╛рдпрдмреНрд░рд░реАрдордзреНрдпреЗ рдХрдореА рдмрджрд▓ рдЭрд╛рд▓реЗ рдЖрд╣реЗрдд. рдпрд╛рдЪреЗ рдХрд╛рд░рдг рд╕реЛрдкреЗ рдЖрд╣реЗ - рдореЛрдХрд│реНрдпрд╛ рд╡реЗрд│реЗрдЪреА рдХрдорддрд░рддрд╛, рдЬреНрдпрд╛ рджрд░рдореНрдпрд╛рди рдХрд╛рд╣реА рд╕рдВрднрд╛рд╡реНрдп рд╕реБрдзрд╛рд░рдгрд╛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреА рд╕реНрд╡рдпрдВрдкреВрд░реНрдгрддрд╛) рдкреБрдвреАрд▓ рдкреНрд░рдХрд╛рд╢рдирд╛рдд рд╣рд▓рд╡рд▓реА рдЧреЗрд▓реА.

рдХрд┐рдВрдмрд╣реБрдирд╛, рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдд рдЦрд╛рд▓реАрд▓ рдмрджрд▓ рдХрд░рдгреНрдпрд╛рдд рдЖрд▓реЗ рдЖрд╣реЗрдд:

  • рдХрд┐рд░рдХреЛрд│ рдХреЛрдб рдирд┐рд░рд╛рдХрд░рдгреЗ.
  • рд░рд┐рдлреЕрдХреНрдЯрд░рд┐рдВрдЧ.
  • рд╡рд┐рджреНрдпрдорд╛рди рдЪрд╛рдЪрдгреНрдпрд╛рдВрдЪреЗ рдкреБрдирд░реНрд░рдЪрдирд╛ рдЖрдгрд┐ рдкрд░рд┐рд╖реНрдХрд░рдг.

рдкреБрдвреАрд▓ рдкреНрд░рдХрд╛рд╢рдирд╛рдВрд╕рд╛рдареА рдпреЛрдЬрдирд╛

рдкрд╛рдпрдерди-рд╢реЗрд▓ рд▓рд╛рдпрдмреНрд░рд░реА

  • рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХрдорд╛рдВрдб рдХреЙрд▓рд╕рд╛рдареА рд╕рдорд░реНрдерди рдЬреЛрдбрдгреЗ (рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреЗ рд╕рдорд╛рдВрддрд░реАрдХрд░рдг).

рд╕реНрдорд╛рд░реНрдЯ-рдПрдирд╡реНрд╣реА рд▓рд╛рдпрдмреНрд░рд░реА

  • ENV рд╡рд░реНрдЧрд╛рддреАрд▓ рдкрд░реНрдпрд╛рд╡рд░рдгреАрдп рдЪрд▓рд╛рдВрдЪреНрдпрд╛ рд╕реНрд╡рдпрдВрдкреВрд░реНрдгрддреЗрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА.
  • рдПрдирд╡реНрд╣реА рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдЗрди рдСрдкрд░реЗрдЯрд░рд╕рд╛рдареА рд╕рдорд░реНрдерди.
  • ENV рд╡рд░реНрдЧрд╛рд╕рд╛рдареА str() рдЖрдгрд┐ repr() рдлрдВрдХреНрд╢рдиреНрд╕рд╕рд╛рдареА рд╕рдорд░реНрдердирд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА.

рдкреБрдвреАрд▓ рдкреНрд░рдХрд╛рд╢рдирд╛рдВрдЪреНрдпрд╛ рддрд╛рд░рдЦрд╛ рдкреБрдвреАрд▓ рд╕рдВрдкреНрд░реЗрд╖рдг рдЪреЕрдиреЗрд▓рд╡рд░ рдШреЛрд╖рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддреАрд▓:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛