Python๊ณผ Bash์˜ ์šฐ์ • ๋งŒ๋“ค๊ธฐ: smart-env ๋ฐ python-shell ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋ชจ๋‘์—๊ฒŒ ์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”.

์˜ค๋Š˜๋‚  Python์€ ์†Œํ”„ํŠธ์›จ์–ด ์ œํ’ˆ ์ž์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธํ”„๋ผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ถ„์•ผ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ž์‹ ์˜ ์˜์ง€์— ์˜ํ•ด์„œ๋“  ๋ฐ˜๋Œ€ํ•˜๋“  ๋‚˜์ค‘์— ์ข‹์€ ์˜ค๋ž˜๋œ Bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ๋ฐฐ์›Œ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Bash์™€ Python์€ ์ฝ”๋“œ ์ž‘์„ฑ์— ๋Œ€ํ•œ ์„œ๋กœ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ณต์–ธํ•˜๊ณ  ํŠน์ • ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ "๋ฑ€ ์–ธ์–ด"๋กœ ํฌํŒ…ํ•˜๋Š” ๊ฒƒ์€ ๋•Œ๋กœ๋Š” ๋ฐฉ๋Œ€ํ•˜๊ณ  ์‚ฌ์†Œํ•œ ์ž‘์—…์ด ์•„๋‹™๋‹ˆ๋‹ค.

DevOps์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Python์˜ ์œ ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ๋งŽ์ด ๋งŒ๋“ค์–ด์กŒ๊ณ  ๊ณ„์†ํ•ด์„œ ๋งŒ๋“ค์–ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ด ๊ฒŒ์‹œ๋ฌผ์˜ ์ž‘์„ฑ์ž๊ฐ€ ๋งŒ๋“  ๋‘ ๊ฐœ์˜ ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์Šค๋งˆํŠธ ํ™˜๊ฒฝ ะธ ํŒŒ์ด์ฌ ์‰˜ - ๊ฐœ๋ฐœ์ž๊ฐ€ Python ์ž‘์—…์˜ ๋ณต์žก์„ฑ์— ๋งŽ์€ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ํ•„์š”๊ฐ€ ์—†๋„๋ก ์„ค๊ณ„ํ•˜์—ฌ ๋” ํฅ๋ฏธ๋กœ์šด ์ž‘์—…์„ ์œ„ํ•œ ์—ฌ์ง€๋ฅผ ๋‚จ๊ฒจ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ™œ๋™ ๋ฒ”์œ„๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ ์™ธ๋ถ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์‹คํ–‰์ž…๋‹ˆ๋‹ค.

๊ด€์‹ฌ ์žˆ๋Š” ๋ถ„๋“ค์€ ๊ณ ์–‘์ด๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”.

์ƒˆ๋กœ์šด "์ž์ „๊ฑฐ"?

์ƒ๋‹นํžˆ ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์„ ์œ„ํ•ด ์ƒˆ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? os.environ ๋ฐ subprocess.<์„ ํƒํ•œ ๋ฉ”์„œ๋“œ ๋˜๋Š” ํด๋ž˜์Šค>๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ ๋„์„œ๊ด€์— ์œ ๋ฆฌํ•œ ์ฆ๊ฑฐ๋ฅผ ๋ณ„๋„๋กœ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์Šค๋งˆํŠธ ํ™˜๊ฒฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ž์‹ ๋งŒ์˜ ์•„์ด๋””์–ด๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ์˜จ๋ผ์ธ์— ์ ‘์†ํ•˜์—ฌ ๊ธฐ์„ฑ ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํ•„์š”ํ•œ ๊ฒƒ์„ ์ฐพ์ง€ ๋ชปํ•  ์œ„ํ—˜์ด ์žˆ์ง€๋งŒ ์ด๋Š” ์˜คํžˆ๋ ค "๋ณดํ—˜ ์ด๋ฒคํŠธ"์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ํšจ๊ณผ์ ์ด๋ฉฐ ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ์ ˆ์•ฝํ•ด ์ค๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์— ๋”ฐ๋ฅด๋ฉด ๊ฒ€์ƒ‰ ์—”์ง„ ๋‹ค์Œ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

  • ์‹ค์ œ๋กœ 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() ๋ฐ ๋น„ํ™œ์„ฑํ™”_automatic_type_cast())์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ง๋ ฌํ™”๋œ JSON๊ณผ ๊ฐ™์€ ๊ฐ์ฒด ๋˜๋Š” ๋ถ€์šธ ์ƒ์ˆ˜๋งŒ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ํŽธ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ "์œ ํšจํ•œ" ๋ฌธ์ž์—ด๊ณผ ๋น„๊ตํ•˜์—ฌ Django์—์„œ DEBUG ๋ณ€์ˆ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ๋ฌธ์ž์—ด์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ณ€ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ž‘์—…์˜ ๋Œ€๋ถ€๋ถ„์€ ์ด๋ฏธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊นŠ์ด์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์‹ ํ˜ธ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚ ์ผ๋ฐ˜์ ์œผ๋กœ ํƒ€์ดํ•‘์€ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฉฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ๋‚ด์žฅ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(frozenset, complex ๋ฐ bytes๋Š” ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค).

Python 2๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ํŠนํžˆ ์œ ๋น„์ฟผํ„ฐ์Šค 3(๋ฉ”ํƒ€ํด๋ž˜์Šค ์‚ฌ์šฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด) ๋•๋ถ„์— ์‚ฌ์‹ค์ƒ ํฌ์ƒ(ํƒ€์ดํ•‘ ํฌ๊ธฐ ๋ฐ Python XNUMX ์ตœ์‹  ๋ฒ„์ „์˜ ์ผ๋ถ€ "์‚ฌํƒ•") ์—†์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ).

๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Python 3 ์ง€์›์€ ๋ฒ„์ „ 3.5 ์ด์ƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(ํ”„๋กœ์ ํŠธ์— Python 3.4์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์€ ๊ฒŒ์œผ๋ฅด๊ฑฐ๋‚˜ ๊ฐœ์„ ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์•„์ง XNUMX๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ๊ด€์ ์ธ ์ด์œ ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).
  • Python 2.7์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ง‘ํ•ฉ ๋ฆฌํ„ฐ๋Ÿด์˜ ์—ญ์ง๋ ฌํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค๋ช… ์—ฌ๊ธฐ์—. ํ•˜์ง€๋งŒ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์€ ๋ถ„์ด ๊ณ„์‹œ๋‹ค๋ฉด ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค :);

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ๊ตฌ๋ฌธ ๋ถ„์„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์–ด๋–ค ๋ถ„์„๊ธฐ์—์„œ๋„ ๋ฌธ์ž์—ด์„ ์ธ์‹ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๊ฐ’์€ ๋ฌธ์ž์—ด๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค(์˜คํžˆ๋ ค ํŽธ์˜์„ฑ๊ณผ Bash์—์„œ ๋ณ€์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๋…ผ๋ฆฌ์™€์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์ด์œ ๋กœ).

ํŒŒ์ด์ฌ ์‰˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ด์ œ ๋‘ ๋ฒˆ์งธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. (๊ธฐ์กด ์•„๋‚ ๋กœ๊ทธ์˜ ๋‹จ์ ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Š” 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. Python ์„ธ๊ณ„์—์„œ Bash๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹จ์ผ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  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. ์Šค๋งˆํŠธ ํ™˜๊ฒฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: ๊นƒํ—ˆ๋ธŒ ะธ PyPI
  2. ํŒŒ์ด์ฌ ์‰˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: ๊นƒํ—ˆ๋ธŒ ะธ PyPI
  3. ์ „๋ณด ์ฑ„๋„ ๋„์„œ๊ด€ ์—…๋ฐ์ดํŠธ

์—…๋ฐ์ดํŠธ 23.02.2020:
* ์ €์žฅ์†Œ๊ฐ€ ์ด๋™๋˜์—ˆ์œผ๋ฉฐ ํ•ด๋‹น ๋งํฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
* python-shell==1.0.1 ๋ฒ„์ „์€ 29.02.2020๋…„ XNUMX์›” XNUMX์ผ ์ถœ์‹œ๋ฅผ ์œ„ํ•ด ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์—๋Š” ๋ช…๋ น ์ž๋™ ์™„์„ฑ ๋ฐ dir(Shell) ๋ช…๋ น ์ง€์›, ์ž˜๋ชป๋œ Python ์‹๋ณ„์ž๋กœ ๋ช…๋ น ์‹คํ–‰ ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€