๋ชจ๋์๊ฒ ์ข์ ํ๋ฃจ ๋์ธ์.
์ค๋๋ Python์ ์ํํธ์จ์ด ์ ํ ์์ฒด๋ฅผ ๋ง๋๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ์ธํ๋ผ๋ฅผ ์ ๊ณตํ๋ ๋ถ์ผ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ธ์ด ์ค ํ๋์ ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, ๋ง์ ๊ฐ๋ฐ์๋ค์ ์์ ์ ์์ง์ ์ํด์๋ ๋ฐ๋ํ๋ ๋์ค์ ์ข์ ์ค๋๋ Bash ์คํฌ๋ฆฝํธ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์๋ก์ด ์ธ์ด๋ฅผ ๋ฐฐ์์ผ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ Bash์ Python์ ์ฝ๋ ์์ฑ์ ๋ํ ์๋ก ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๊ณต์ธํ๊ณ ํน์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฆ, Bash ์คํฌ๋ฆฝํธ๋ฅผ "๋ฑ ์ธ์ด"๋ก ํฌํ ํ๋ ๊ฒ์ ๋๋ก๋ ๋ฐฉ๋ํ๊ณ ์ฌ์ํ ์์ ์ด ์๋๋๋ค.
DevOps์ ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด 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
์์ด๋์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Python ์ธ๊ณ์์ Bash๋ฅผ ๋ํ๋ด๋ ๋จ์ผ ํด๋์ค์ ๋๋ค.
- ๊ฐ Bash ๋ช ๋ น์ Shell ํด๋์ค์ ํจ์๋ก ํธ์ถ๋ฉ๋๋ค.
- ๊ทธ๋ฐ ๋ค์ ๊ฐ ํจ์ ํธ์ถ์ ๋ํ ๋งค๊ฐ๋ณ์๊ฐ ํด๋น Bash ๋ช ๋ น ํธ์ถ์ ์ ๋ฌ๋ฉ๋๋ค.
- ๊ฐ ๋ช ๋ น์ ํธ์ถ๋๋ ์๊ฐ "์ง๊ธ ์ฌ๊ธฐ"์์ ์คํ๋ฉ๋๋ค. ๋๊ธฐ์ ์ ๊ทผ ๋ฐฉ์์ด ์๋ํฉ๋๋ค.
- stdout์ ๋ช ๋ น ์ถ๋ ฅ๊ณผ ํด๋น ๋ฐํ ์ฝ๋์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
- ๋ช ๋ น์ด ์์คํ ์ ์์ผ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
smart-env์ ๋ง์ฐฌ๊ฐ์ง๋ก Python 2๋ ์ง์๋์ง๋ง(์ฝ๊ฐ ๋ ๋ง์ ํฌ์์ด ํ์ํจ) Python 3.0-3.4๋ ์ง์๋์ง ์์ต๋๋ค.
๋์๊ด ๊ฐ๋ฐ ๊ณํ
์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ ๋ค ๊ณต์ PyPI์ ๊ฒ์๋์ด ์์ต๋๋ค. ์์ค๋ Github์์ ํ์ธํ ์ ์์ต๋๋ค(์๋ ์ฐธ์กฐ).
๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ๋ ๊ด์ฌ ์๋ ์ฌ๋๋ค๋ก๋ถํฐ ์์ง๋ ํผ๋๋ฐฑ์ ๊ณ ๋ คํ์ฌ ๊ฐ๋ฐ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ smart-env์์ ๋ค์ํ ์๋ก์ด ๊ธฐ๋ฅ์ ์๊ฐํด๋ด๋ ๊ฒ์ด ์ด๋ ค์ธ ์ ์๋ค๋ฉด python-shell์๋ ํ์คํ ์ถ๊ฐํ ๋ค๋ฅธ ๊ฒ์ด ์์ต๋๋ค:
- ๋น์ฐจ๋จ ํตํ ์ง์;
- ํ๊ณผ์ ๋ํ์ ์์ฌ์ํต ๊ฐ๋ฅ์ฑ(stdin์ ์ฌ์ฉํ์ฌ ์์ )
- ์ ์์ฑ ์ถ๊ฐ(์: stderr์์ ์ถ๋ ฅ์ ์์ ํ๋ ์์ฑ)
- ์ฌ์ฉ ๊ฐ๋ฅํ ๋ช ๋ น ๋๋ ํ ๋ฆฌ ๊ตฌํ(dir() ํจ์์ ํจ๊ป ์ฌ์ฉ)
- ๊ธฐํ
์ฐธ์กฐ
- ์ค๋งํธ ํ๊ฒฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
๊นํ๋ธ ะธPyPI - ํ์ด์ฌ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
๊นํ๋ธ ะธPyPI ์ ๋ณด ์ฑ๋ ๋์๊ด ์ ๋ฐ์ดํธ
์
๋ฐ์ดํธ 23.02.2020:
* ์ ์ฅ์๊ฐ ์ด๋๋์์ผ๋ฉฐ ํด๋น ๋งํฌ๊ฐ ์
๋ฐ์ดํธ๋์์ต๋๋ค.
* python-shell==1.0.1 ๋ฒ์ ์ 29.02.2020๋
XNUMX์ XNUMX์ผ ์ถ์๋ฅผ ์ํด ์ค๋น ์ค์
๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์๋ ๋ช
๋ น ์๋ ์์ฑ ๋ฐ dir(Shell) ๋ช
๋ น ์ง์, ์๋ชป๋ Python ์๋ณ์๋ก ๋ช
๋ น ์คํ ๋ฐ ๋ฒ๊ทธ ์์ ์ด ํฌํจ๋ฉ๋๋ค.
์ถ์ฒ : habr.com