Python

GreenBeanยท2021๋…„ 4์›” 15์ผ
post-thumbnail

Modules & Packages

โœ” `sys.modules` ์™€ `sys.path`์˜ ์ฐจ์ด์ 

  • sys.modules

ํŒŒ์ด์ฌ์ด ๋ชจ๋“ˆ์ด๋‚˜ package๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ํ™•์ธํ•˜๋Š” ๊ณณ

sys.modules๋Š” ๋‹จ์ˆœํ•œ dictionary. ์ด๋ฏธ import๋œ ๋ชจ๋“ˆ๊ณผ package๋“ค์„ ์ €์žฅํ•˜๊ณ  ์žˆ์Œ. ์ฆ‰, ํ•œ๋ฒˆ import๋œ ๋ชจ๋“ˆ๊ณผ package๋“ค์€ ํŒŒ์ด์ฌ์ด ๋˜ ๋‹ค์‹œ ์ฐพ์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ ์žˆ์Œ. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ import ํ•˜๋Š” ๋ชจ๋“ˆ์€ sys.modules ์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Œ

  • sys.path

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณด๋Š” ์žฅ์†Œ๊ฐ€ ๋ฐ”๋กœ sys.path

sys.path๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ list์ด๋ฉฐ string ์š”์†Œ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” list. ๊ฐ string ์š”์†Œ๋“ค์€ ๋‹ค์Œ ์ฒ˜๋Ÿผ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋ƒ„

['',
 '/Users/song-eun-u/anaconda3/bin',
 '/Users/song-eun-u/anaconda3/lib/python36.zip',
 '/Users/song-eun-u/anaconda3/lib/python3.6',
 '/Users/song-eun-u/anaconda3/lib/python3.6/lib-dynload',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/aeosa',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/IPython/extensions',
 '/Users/song-eun-u/.ipython']

ํŒŒ์ด์ฌ์€ list์˜ ๊ฐ ๊ฒฝ๋กœ๋ฅผ ํ•˜๋‚˜ ํ•˜๋‚˜ ํ™•์ธํ•˜๋ฉด์„œ ํ•ด๋‹น ๊ฒฝ๋กœ์— import ํ•˜๊ณ ์ž ํ•˜๋Š” package๊ฐ€ ์œ„์น˜ํ•ด ์žˆ๋Š”์ง€ ํ™•์ธํ•จ

์ •๋ฆฌ๋ฅผ ํ•˜์ž๋ฉด, ํŒŒ์ด์ฌ์€ import ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“ˆ๊ณผ package๋ฅผ ์ฐพ์„๋•Œ์— ๋จผ์ € sys.modules๋ฅผ ๋ณด๊ณ , ์—†์œผ๋ฉด ํŒŒ์ด์ฌ built-in ๋ชจ๋“ˆ๋“ค์„ ํ™•์ธ ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ sys.path์— ์ง€์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ๋กœ๋“ค์„ ํ™•์ธํ•ด์„œ ์ฐพ์Šต๋‹ˆ๋‹ค.
sys.path ์—์„œ๋„ ๋ชป์ฐพ์œผ๋ฉด ModuleNotFoundError ์—๋Ÿฌ๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.


โœ” `sys` ๋ชจ๋“ˆ ์œ„์น˜ ์ฐพ๋Š” ๋ฐฉ๋ฒ•

sys ๋Š” ํŒŒ์ด์ฌ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“ˆ

๋‹ค์Œ ์ฒ˜๋Ÿผ sys ๋ชจ๋“ˆ์„ import ํ•ด์„œ sys.modules์™€ sys.path ๋ฅผ ์ถœ๋ ฅํ• ์ˆ˜๋„ ์žˆ๊ณ  ์ˆ˜์ •๋„ ๊ฐ€๋Šฅ

import sys

print(sys.path)
print(sys.modules)

ํŒŒ์ด์ฌ์ด ์„ค์น˜๋ ๋•Œ ๋‚ด์žฅ ๋ชจ๋“ˆ๋„ ๊ฐ™์ด ์„ค์น˜๋˜๋ฏ€๋กœ path์˜ ์ •๋ณด๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ •ํ•ด์ ธ ์žˆ์Œ. sys๋„ ์ด๋ฏธ built-in ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— Built-in ๋ชจ๋“ˆ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ


โœ” absolute path์™€ relative path์˜ ์ฐจ์ด์ 

Python์˜ ์ ˆ๋Œ€๊ฒฝ๋กœ์™€ ์ƒ๋Œ€๊ฒฝ๋กœ๋ฅผ ํ†ตํ•œ ๋ชจ๋“ˆ๊ณผ ํŒจํ‚ค์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ๋ฆฌ๋ˆ…์Šค์˜ ๋””๋ ‰ํ† ๋ฆฌ/ํŒŒ์ผ ์˜ ํŠธ๋ฆฌ๊ตฌ์กฐ๋ฅผ ์ด์šฉ. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ๋ˆ…์Šค์˜ ํŒŒ์ผ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž์œ ๋„๊ฐ€ ํ›จ์”ฌ ๋†’์•„์ง
  • absolute path (์ ˆ๋Œ€๊ฒฝ๋กœ)
    • import ํ•˜๋Š” ํŒŒ์ด์ฌ ํŒŒ์ผ์˜ ํ˜„์žฌ ๊ฒฝ๋กœ์— ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ๊ฒฝ๋กœ๊ฐ€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€ ๊ฒฝ๋กœ
  • relative path (์ƒ๋Œ€๊ฒฝ๋กœ)
    • import ํ•˜๋Š” ํŒŒ์ด์ฌ ํŒŒ์ผ์˜ ํ˜„์žฌ ๊ฒฝ๋กœ์— ์ƒ๋Œ€์ ์œผ๋กœ ๊ฒฝ๋กœ๊ฐ€ ์ •ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€ ๊ฒฝ๋กœ

relative path๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋ฅผ ์ค„์—ฌ์ค€๋‹ค๋Š” ์žฅ์ ์€ ์žˆ์ง€๋งŒ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฝ๊ณ  ํŒŒ์ผ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ฒฝ๋กœ ์œ„์น˜๋„ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Œ. ์›ฌ๋งŒํ•œ ๊ฒฝ์šฐ absolute path ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ


โœ” main module์—์„œ package์˜ module ์ž„ํฌํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•

main.py์—์„œ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ add_and_mutiply๋ฅผ ์ž„ํฌํŠธ ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

>>> ImportError: attempted relative import with no known parent package

main module๋กœ ์‚ฌ์šฉ๋  ๋ชฉ์ ์˜ ๋ชจ๋“ˆ๋“ค์€ ๋ฐ˜๋“œ์‹œ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์ž„ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ. ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์ž„ํฌํŠธํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ์—†์ด ์ž„ํฌํŠธ ๊ฐ€๋Šฅ


โœ” `add_and_multiply.py`์—์„œ `multiply`ํ•จ์ˆ˜๋ฅผ ์ ˆ๋Œ€๊ฒฝ๋กœ์™€ ์ƒ๋Œ€๊ฒฝ๋กœ๋„ ๊ฐ๊ฐ ์ž„ํฌํŠธ ํ•ด๋ณด๊ณ  main ๋ชจ๋“ˆ๊ณผ ์ฐจ์ด์  ์ƒ๊ฐํ•ด๋ณด๊ธฐ

  • ์ ˆ๋Œ€๊ฒฝ๋กœ์™€ ์ƒ๋Œ€๊ฒฝ๋กœ ๋ชจ๋‘ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋ฌ์œผ๋ฉฐ ๊ฒฐ๊ณผ๋Š” ๋™์ผ

  • ์ฐจ์ด์  : add_and_multiply.py๋Š” main module์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋“  ์ƒ๋Œ€ ๊ฒฝ๋กœ๋“  ๋ฌธ์ œ ์—†์ด ๋™์ž‘. main module์ด ์•„๋‹ˆ๋ฉด ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋“  ์ƒ๋Œ€ ๊ฒฝ๋กœ๋“  ์ž‘๋™์— ๋ฌธ์ œ ์—†์Œ


โœ” `__init__.py` ํŒŒ์ผ์˜ ์—ญํ• 

  • __init__.py๋Š” ์กด์žฌํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋Š” ํŒจํ‚ค์ง€์˜ ์ผ๋ถ€์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• 
  • package ์ดˆ๊ธฐ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์—ญํ• 
  • __init__.py ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ํŒจํ‚ค์ง€์˜ ์ผ๋ถ€์ธ์ง€ ์ธ์‹์„ ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š”๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋จ
  • ์ดˆ๊ธฐ์˜ __init__.py์€ ๋นˆ ํŒŒ์ผ์ด์ง€๋งŒ package ์‹คํ–‰ ์‹œ ์ดˆ๊ธฐ ์„ค์ •์„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ํŒŒ์ผ์— ์ดˆ๊ธฐ ์„ค์ •์— ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์„ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋จ. ์ž‘์„ฑ ํ•œ ์ฝ”๋“œ์˜ ๋‚ด์šฉ๋Œ€๋กœ package ์‹คํ–‰ ์‹œ ์ดˆ๊ธฐ ์„ค์ •์ด ์ž๋™์œผ๋กœ ์‹คํ–‰
profile
๐ŸŒฑ Backend-Dev | hwaya2828@gmail.com

0๊ฐœ์˜ ๋Œ“๊ธ€