Absolute path vs relative path๐Ÿ—บ

Inah-_-ยท2021๋…„ 2์›” 27์ผ
0

Python

๋ชฉ๋ก ๋ณด๊ธฐ
17/21
post-thumbnail
post-custom-banner

Why?

์™œ Absolute path๋‚˜ relative path ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

ํŒŒ์ด์ฌ์˜ built-in ๋ชจ๋“ˆ๊ณผ pip ์„ ํ†ตํ•ด ์„ค์น˜ํ•œ ์™ธ๋ถ€ ๋ชจ๋“ˆ ๋ฐ
package๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ import ํ•˜๋Š”๋ฐ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

์™œ๋ƒํ•˜๋ฉด built-in ๋ชจ๋“ˆ์€ ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜์–ด ์žˆ๊ณ 
pip๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•œ ์™ธ๋ถ€ ๋ชจ๋“ˆ์€ ์ž๋™์œผ๋กœ site-packages ๋””๋ ‰ํ† ๋ฆฌ์— ์„ค์น˜๊ฐ€ ๋˜๋Š”๋ฐ,
site-packages ๋Š” sys.path์— ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ธ์ œ Absolute path๋‚˜ Relative path ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?
๋ฐ”๋กœ ์ง์ ‘ ๊ฐœ๋ฐœํ•œ local package์— importํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

Absoulte path(์ ˆ๋Œ€๊ฒฝ๋กœ)

importํ•˜๋Š” ํŒŒ์ผ์ด๋‚˜ ๊ฒฝ๋กœ์— ์ƒ๊ด€์—†์ด ๊ฒฝ๋กœ๊ฐ€ ํ•ญ์ƒ ๋™์ผํ•˜๋‹ค.
์ ˆ๋Œ€ ๊ฒฝ๋กœ๋Š” ๋‹จ์–ด์˜ ์˜๋ฏธ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์–ด๋– ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š”๋ฐ์— ์žˆ์–ด์„œ ๊ณ ์œ ์˜ ๊ฒฝ๋กœ.

์ ˆ๋Œ€ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋ฃจํŠธ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์ฃผ์–ด์ง„ ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์—
์—‘์„ธ์Šค ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์–ด๋””์—์„œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ ์ง€์ •๋ฐฉ์‹

  • absolute path๋ฅผ ์‚ฌ์šฉ์‹œ ๋‹จ์ : ๊ฒฝ๋กœ๊ฐ€ ๊ธธ์–ด์ง„๋‹ค

  • ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ(์ตœ์ƒ๋‹จ ๋””๋ ‰ํ† ๋ฆฌ)์—์„œ ์‹œ์ž‘

โ””โ”€โ”€ my_project
    โ”œโ”€โ”€ main.py
    โ”œโ”€โ”€ package1
    โ”‚   โ”œโ”€โ”€ module1.py
    โ”‚   โ””โ”€โ”€ module2.py
    โ””โ”€โ”€ package2
        โ”œโ”€โ”€ __init__.py
        โ”œโ”€โ”€ module3.py
        โ”œโ”€โ”€ module4.py
        โ””โ”€โ”€ subpackage1
            โ””โ”€โ”€ module5.py

์ด ํ”„๋กœ์ ํŠธ๋ฅผ Absoulte path๋ฅผ ์‚ฌ์šฉํ•ด package1๊ณผ package2๋ฅผ importํ•œ๋‹ค๋ฉด,

from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2

๊ฒฝ๋กœ์˜ ์‹œ์ž‘์ ์ด ๋ชจ๋‘ my_project์˜ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฑฐ์นœ๋‹ค.

subpackage1 > module5์˜ function2 ๊ฒฝ๋กœ ํ‘œํ˜„

package2.subpackage1.module5.py

# my_project์˜ ํ”„๋กœ์ ํŠธ ์•ˆ์— ์žˆ์œผ๋ฏ€๋กœ my_project๋Š” ์ƒ๋žต๋œ๋‹ค.

from import ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ์‹œ

from package2.subpackage1.module5 import function2

Absoulte path(์ ˆ๋Œ€๊ฒฝ๋กœ) ์ •๋ฆฌ

ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์–ด๋Š ํŒŒ์ผ, ์–ด๋Š ์œ„์น˜์—์„œ import ํ•˜๋˜์ง€
๊ฒฝ๋กœ๊ฐ€ ํ•ญ์ƒ ์œ„์™€ ๊ฐ™์ด ๋™์ผํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ absolute path ๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ






Relative path(์ƒ๋Œ€๊ฒฝ๋กœ)

Relative path ๋Š” absolute path์™€ ๋‹ค๋ฅด๊ฒŒ import ํ•˜๋Š” ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ์ผ๋ฐ˜์ ์œผ๋กœ relative path๋Š” local package์•ˆ์—์„œ ๋‹ค๋ฅธ local package๋ฅผ import ํ• ๋•Œ ์‚ฌ์šฉ

  • importํ•˜๋Š” ์œ„์น˜ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•œ๋‹ค.

  • ์„ ์–ธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

  • ์ ˆ๋Œ€๊ฒฝ๋กœ์™€ ๋ฐ˜๋Œ€๋กœ ์„ ์–ธํ•  ์‹œ ํŒŒ์ผ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ฒฝ๋กœ ์œ„์น˜๋„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

โ””โ”€โ”€ my_project
    โ”œโ”€โ”€ main.py
    โ”œโ”€โ”€ package1
    โ”‚   โ”œโ”€โ”€ module1.py
    โ”‚   โ””โ”€โ”€ module2.py
    โ””โ”€โ”€ package2
        โ”œโ”€โ”€ __init__.py
        โ”œโ”€โ”€ module3.py
        โ”œโ”€โ”€ module4.py
        โ””โ”€โ”€ subpackage1
            โ””โ”€โ”€ module5.py

ํ˜„์žฌ ์œ„์น˜๋Š” package2.module3.py์ด๋ผ๊ณ  ํ•  ๋•Œ,

package2์˜ module3์—์„œ >
package2์˜ class1์™€
package2์˜ ํ•˜์œ„ package์ธ subpackage1์˜ module5์˜ function2 ํ•จ์ˆ˜๋ฅผ importํ•œ๋‹ค๋ฉด,

# package2/module3.py

from . import class1
from .subpackage1.module5 import function2

๋กœ ๊ฒฝ๋กœ๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

ํ˜„์žฌ ์œ„์น˜๊ฐ€ package2.module4.py์ด๋ผ๊ณ  ํ•  ๋•Œ,
package1์˜ module1๋‚ด function2 ํ•จ์ˆ˜๋ฅผ importํ•œ๋‹ค๋ฉด,

from ..package1.module1 import function2

Relative path(์ƒ๋Œ€๊ฒฝ๋กœ) ์ •๋ฆฌ

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



profile
Backend Developer
post-custom-banner

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