๐Ÿ•ท๏ธ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 105 (from laksa182)

2. Crawled Status Check

Query:
Response:

3. Robots.txt Check

Query:
Response:

4. Spam/Ban Check

Query:
Response:

5. Seen Status Check

โ„น๏ธ Skipped - page is already crawled

๐Ÿ“„
INDEXABLE
โœ…
CRAWLED
14 days ago
๐Ÿค–
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffPASSdownload_stamp > now() - 6 MONTH0.5 months ago
History dropPASSisNull(history_drop_reason)No drop reason
Spam/banPASSfh_dont_index != 1 AND ml_spam_score = 0ml_spam_score=0
CanonicalPASSmeta_canonical IS NULL OR = '' OR = src_unparsedNot set

Page Details

PropertyValue
URLhttps://velog.io/@jiggyjiggy/Python-import-path-absolute-path-relative-path-name-main
Last Crawled2026-03-25 01:33:34 (14 days ago)
First Indexed2022-04-05 23:34:05 (4 years ago)
HTTP Status Code200
Meta Title[Python] import path / absolute path, relative path / __name__, __main__
Meta Descriptionimport ๊ณผ์ •์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”: "๊ฒฝ๋กœ" ํŽธ
Meta Canonicalnull
Boilerpipe Text
absolute path ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์™„์ „ํ•œ ํ˜•ํƒœ์˜ ๊ฒฝ๋กœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค relative path import ํ•˜๋Š” ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ๋Œ€์ ์ธ ๊ฒฝ๋กœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค absolute path์™€ relative path๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? Absolute imports are recommended, as they are usually more readable and tend to be better behaved (or at least give better error messages) if the import system is incorrectly configured (such as when a directory inside a package ends up on sys.path) However, explicit relative imports are an acceptable alternative to absolute imports, especially when dealing with complex package layouts where using absolute imports would be unnecessarily verbose https://peps.python.org/pep-0008/#imports ๊ณต์‹๋ฌธ์„œ(PEP8)์— ๋”ฐ๋ฅด๋ฉด ์ ˆ๋Œ€ ๊ฒฝ๋กœ(absolute path)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค ๋‹ค๋งŒ, ๊ฐ™์€ package ์†์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฅํ™ฉํ•œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ผ๋ฉด ์ƒ๋Œ€ ๊ฒฝ๋กœ(relative path)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ๊ณ  ์“ฐ์—ฌ์žˆ์Šต๋‹ˆ๋‹ค PEP (Python Enhancement Proposal) ๋งํฌ PEP 8 ๋งํฌ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค my_app ์ด๋ผ๋Š” project๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฌ๋Ÿฌ directory์™€ file์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค absolute path ์œ„ ๊ตฌ์กฐ์—์„œ main.py ์— module1.py ์™€ module5.py ๋ฅผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด import ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค # main.py from package1 import module1 from package2 . subpackage import module5 ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ์‹œ my_app ์€ ์ƒ๋žต๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. my_app์ด ์‹œ์ž‘์ (entry point) ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ์‹œ ์‹œ์ž‘์ ์€ project directory ์ž…๋‹ˆ๋‹ค my_app ์ด๋ผ๋Š” project๋ฅผ ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ sys.path์— ์š”์†Œ์— ์ถ”๊ฐ€๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— my_app directory๊ฐ€ ์‹œ์ž‘์ ์œผ๋กœ ์„ค์ •๋˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค project directory์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ sys.path์— ์š”์†Œ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. import search flow ๋งํฌ relative path ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด my_app directory์— new_module.py๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค module4์—์„œ ํ˜„์žฌ directoty์˜ module4.py ์™€ ํ•˜์œ„ directory์ธ subpackage์˜ module5.py์™€ ์ƒ์œ„ directory์˜ new_module.py ๋ฅผ importํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค # module3.py from . import module4 from . subpackage import module5 from . . import new_module import ํ•˜๋Š” file์˜ directory๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์žก์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ package2๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ์จ, .(Dot)์„ ํ†ตํ•˜์—ฌ directory๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค Dot ๊ฐฏ์ˆ˜๋ณ„ directory ์œ„์น˜ 1๊ฐœ: ์‹œ์ž‘์  directoy 2๊ฐœ: ์ƒ์œ„ directory ํ•˜์ง€๋งŒ PEP 8์— ๋‚˜์™€์žˆ๋“ฏ, ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ importํ•˜๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ๋‚˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ–ˆ์„๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ ์€ file ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ๊ฒฝ๋กœ๋„ ๋‹ค์‹œ ์ง€์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค! __init__.py file์˜ ์—ญํ•  ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด __init__.py file์ด ๋ณด์ž…๋‹ˆ๋‹ค. __init__.py ์€ ํ•ด๋‹น directory๊ฐ€ package ์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™” class ์„ ์–ธ ์‹œ __init__ ๋Š” magic method๋กœ์จ ์‚ฌ์šฉ๋˜๋ฉฐ, instance์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ __init__.py ์€ directory ์ˆ˜์ค€(level)์—์„œ๋„ package์˜ ์ดˆ๊ธฐํ™” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค package๊ฐ€ import ๋  ๋•Œ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ • import ํ• ๋•Œ ๊ฒฝ๋กœ์˜ ์ด ๊ธธ์ด ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๊ณ  package์—์„œ import ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค Python3.3 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” __init__.py file์ด ์—†์–ด๋„ ํŒจํ‚ค์ง€๋กœ ์ธ์‹ํ•˜์ง€๋งŒ ํ•˜์œ„ ๋ฒ„์ „ ํ˜ธํ™˜์„ ์œ„ํ•ด __init__.py file์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์‹ค์Šต (calculator) ์ง์ ‘ ์‹คํ–‰(run) ํ•˜๋Š” module ์— ์ ํžˆ๋Š” import ๊ฒฝ๋กœ๋Š” ์ œ์•ฝ์‚ฌํ•ญ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค ์ œ์•ฝ์‚ฌํ•ญ์„ ์•Œ์•„๋ณด๊ธฐ์œ„ํ•ด ์‹ค์Šต์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต main.py ์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— main.py ์—์„œ import ๋ฅผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ํ–ˆ์„๋•Œ์™€ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ ํ–ˆ์„๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. main.py ์˜ ์ ˆ๋Œ€๊ฒฝ๋กœ C:\Users\jigiseong\PycharmProjects\velog\venv\Scripts\python.exe C:/Users/jigiseong/PycharmProjects/velog/main.py 5 Process finished with exit code 0 main.py ์—์„œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ•˜๊ณ  ์ง์ ‘ ์‹คํ–‰ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค ์œ„์น˜๋ฅผ ๋ชจ๋‘ ๋•Œ๋ ค ๋ฐ•์œผ๋‹ˆ ๋‹น์—ฐํžˆ ์ •์ƒ์ž‘๋™ ํ•˜๊ฒ ์ฃ ? main.py ์˜ ์ƒ๋Œ€๊ฒฝ๋กœ ? ์•„๋ž˜์˜ ๋„์‹์ฒ˜๋Ÿผ . velog ๋ผ๋Š” directory์—์„œ C:\Users\jigiseong\PycharmProjects\velog\venv\Scripts\python.exe C:/Users/jigiseong/PycharmProjects/velog/main.py Traceback (most recent call last): File "C:\Users\jigiseong\PycharmProjects\velog\main.py", line 5, in < module > from .calculator.add_and_multiply import add_and_multiply ImportError: attempted relative import with no known parent package Process finished with exit code 1 ImportError: attempted relative import with no known parent package main.py ์—์„œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ์•Œ๋ ค์ง„ ์ƒ์œ„ ํŒจํ‚ค์ง€๊ฐ€ ์—†๋Š” ์ƒ๋Œ€ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ๋„๋ผ๋Š” importError ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. (์ฆ‰ entry point๊ฐ€ velog๊ฐ€ ์•„๋‹Œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค) "main.py๋Š” velog ํŒจํ‚ค์ง€ ๋งž๋Š”๋ฐ;; ์™ธ์•Š๋˜;;;" ์ƒ๋Œ€ ๊ฒฝ๋กœ์—์„œ ์‹œ์ž‘์  directory๋ฅผ velog๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋Š” ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” module์€, ์ด๋ฆ„์ด "__main__" ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค ๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด Note that relative imports are based on the name of the current module. Since the name of the main module is always "__main__" , modules intended for use as the main module of a Python application must always use absolute imports. https://docs.python.org/3/tutorial/modules.html#intra-package-references ๊ฒฐ๋ก ๋งŒ ์ถ•์•ฝํ•ด๋ณด์ž๋ฉด "์ง์ ‘ ์‹คํ–‰ํ•  module์—์„œ๋Š” ํ•ญ์ƒ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ•ด์•ผํ•œ๋‹ค" ์ž…๋‹ˆ๋‹ค ์ด์œ ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„  Python ์—๋Š” module๋ผ๋Š” Data model ์—๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ์†์„ฑ: __name__ ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ๊ณผ ์ƒ๋Œ€๊ฒฝ๋กœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ธฐ์ค€์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค module์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์†์„ฑ: __name__ ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค https://docs.python.org/3/reference/datamodel.html#special-method-names The __name__ attribute must be set to the fully-qualified name of the module. This name is used to uniquely identify the module in the import system. https://docs.python.org/3/reference/import.html#import-related-module-attributes ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ด์œ ๋ฅผ ์ˆœ๋ฒˆ์— ๋งž์ถฐ ์„œ์ˆ ํ•ด ๋ดค์Šต๋‹ˆ๋‹ค. module์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์†์„ฑ์œผ๋กœ __name__ ์†์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. __name__ ์†์„ฑ์— ์— module ์˜ ์ด๋ฆ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” module์€, ์ด๋ฆ„์ด __main__ ์ด ์ €์žฅ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ __name__ = "__main__" ์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค ์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” ํ•ด๋‹น ์†์„ฑ์„ ํ†ตํ•ด ( __name__ ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๋ฌธ์ž์—ด์„ ํ†ตํ•ด) ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค ์ฆ‰, ์ง์ ‘ ์‹คํ–‰๋˜๋Š” module์€ ์›๋ž˜์˜ ์œ„์น˜๊ฐ€ ์•„๋‹Œ "__main__" ์— ํ•ด๋‹นํ•˜๋Š” ์œ„์น˜๋กœ ๊ณ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์“ธ ์ˆ˜ ์—†๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค! "์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”๋†“๊ณ  ์˜ˆ์ „ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์จ๋‘๋‹ˆ ๋ ๋ฆฌ๊ฐ€ ์—†๊ฒ ์ฃ ?" jiggyjiggy : "a์•ผ, ์šฐ์ธก์œผ๋กœ 1์นธ, ์•„๋ž˜๋กœ 1์นธ ์ด๋™ํ•˜๋ฉด ๋ˆ„๊ฐ€์žˆ์ง€?" a: "f๊ฐ€ ์žˆ์ง€" jiggyjiggy : "a์•ผ, ์šฐ์ธก์œผ๋กœ 1์นธ, ์•„๋ž˜๋กœ 1์นธ ์ด๋™ํ•˜๋ฉด ๋ˆ„๊ฐ€์žˆ์ง€?" a: "์•„๋ฌด๋„ ์—†์ง€;;" ์ง์ ‘ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” module์—์„œ์˜ import ๊ฒฝ๋กœ ์ง์ ‘ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” module์—์„œ์˜ import ๊ฒฝ๋กœ๋Š” ์ ˆ๋Œ€๊ฒฝ๋กœ, ์ƒ๋Œ€๊ฒฝ๋กœ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— __name__ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๊ฒ ์ฃ ? ใ…Žใ…Ž ํ•˜์ง€๋งŒ PEP 8์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ, ์ƒ๋Œ€๊ฒฝ๋กœ๋Š” file์˜ ์œ„์น˜๊ฐ€ ๋ณ€ํ•œ๋‹ค๋ฉด ๋ฐ”๋€Œ๋Š” ๊ฒฝ๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์€ ์Šต๊ด€์ž…๋‹ˆ๋‹ค ๋ฒˆ์™ธ. Python code๋ฅผ ๋ณด๋‹ค๋ณด๋ฉด if __name__ == '__main__' : ๋ฅผ ์ž์ฃผ ์ ‘ํ•˜์…จ์„ ๊ฒ๋‹ˆ๋‹ค import ํ–ˆ๋Š”๋ฐ ํ•ด๋‹น ํŒŒ์ผ์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์žˆ๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค ๋งํฌ๋กœ ๋นผ ๋งํฌ
Markdown
[jiggyjiggy.log](https://velog.io/@jiggyjiggy/posts) ๋กœ๊ทธ์ธ [jiggyjiggy.log](https://velog.io/@jiggyjiggy/posts) ๋กœ๊ทธ์ธ # \[Python\] import path / absolute path, relative path / \_\_name\_\_, \_\_main\_\_ [์ง€๊ธฐ์„ฑ](https://velog.io/@jiggyjiggy/posts)ยท2022๋…„ 4์›” 3์ผ ํŒ”๋กœ์šฐ 0 [Absolute Path](https://velog.io/tags/Absolute-Path)[Relative Path](https://velog.io/tags/Relative-Path)[\_\_init\_\_.py](https://velog.io/tags/init.py)[entry-point](https://velog.io/tags/entry-point)[import](https://velog.io/tags/import)[main](https://velog.io/tags/main)[name](https://velog.io/tags/name)[python](https://velog.io/tags/python)[์ƒ๋Œ€๊ฒฝ๋กœ](https://velog.io/tags/%EC%83%81%EB%8C%80%EA%B2%BD%EB%A1%9C)[์ ˆ๋Œ€๊ฒฝ๋กœ](https://velog.io/tags/%EC%A0%88%EB%8C%80%EA%B2%BD%EB%A1%9C) ![post-thumbnail](https://media.vlpt.us/images/jiggyjiggy/post/9d366172-faf8-4813-a1f5-7e2da3153403/python%20logo.png) ## absolute path ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์™„์ „ํ•œ ํ˜•ํƒœ์˜ ๊ฒฝ๋กœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค ## relative path import ํ•˜๋Š” ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ๋Œ€์ ์ธ ๊ฒฝ๋กœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค ## absolute path์™€ relative path๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? > Absolute imports are recommended, as they are usually more readable and tend to be better behaved (or at least give better error messages) if the import system is incorrectly configured (such as when a directory inside a package ends up on sys.path) > > However, explicit relative imports are an acceptable alternative to absolute imports, especially when dealing with complex package layouts where using absolute imports would be unnecessarily verbose > > <https://peps.python.org/pep-0008/#imports> ๊ณต์‹๋ฌธ์„œ(PEP8)์— ๋”ฐ๋ฅด๋ฉด 1. ์ ˆ๋Œ€ ๊ฒฝ๋กœ(absolute path)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค 2. ๋‹ค๋งŒ, ๊ฐ™์€ package ์†์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฅํ™ฉํ•œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ผ๋ฉด ์ƒ๋Œ€ ๊ฒฝ๋กœ(relative path)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ๊ณ  ์“ฐ์—ฌ์žˆ์Šต๋‹ˆ๋‹ค *** PEP (Python Enhancement Proposal) ~~**๋งํฌ**~~ PEP 8 ~~**๋งํฌ**~~ *** # ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค my\_app ์ด๋ผ๋Š” project๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฌ๋Ÿฌ directory์™€ file์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค ![hierachy structure](https://media.vlpt.us/images/jiggyjiggy/post/a084b0ef-7398-4a4f-9f6c-19264a0d3aee/hierachy%20file%20structure.drawio%20\(3\).svg) ## absolute path ์œ„ ๊ตฌ์กฐ์—์„œ main.py ์— module1.py ์™€ module5.py ๋ฅผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด import ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ![absolute path](https://media.vlpt.us/images/jiggyjiggy/post/ff2317a5-74fa-4392-9e0d-5222b03dec24/hierachy%20file%20structure%20absolute%20import.drawio%20\(4\).svg) ``` # main.py from package1 import module1 from package2.subpackage import module5 ``` ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ์‹œ my\_app ์€ ์ƒ๋žต๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. my\_app์ด ์‹œ์ž‘์ (entry point) ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ์‹œ ์‹œ์ž‘์ ์€ project directory ์ž…๋‹ˆ๋‹ค my\_app ์ด๋ผ๋Š” project๋ฅผ ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ sys.path์— ์š”์†Œ์— ์ถ”๊ฐ€๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— my\_app directory๊ฐ€ ์‹œ์ž‘์ ์œผ๋กœ ์„ค์ •๋˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค *** project directory์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ sys.path์— ์š”์†Œ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. import search flow ~~**๋งํฌ**~~ *** ## relative path ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด my\_app directory์— new\_module.py๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค module4์—์„œ ํ˜„์žฌ directoty์˜ module4.py ์™€ ํ•˜์œ„ directory์ธ subpackage์˜ module5.py์™€ ์ƒ์œ„ directory์˜ new\_module.py ๋ฅผ importํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ![relative path](https://media.vlpt.us/images/jiggyjiggy/post/b1b0b532-5f28-46a1-ab18-8a7bc2f8b075/relative%20path.drawio%20\(3\).svg) ``` # module3.py from . import module4 from .subpackage import module5 from .. import new_module ``` import ํ•˜๋Š” file์˜ directory๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์žก์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ package2๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ์จ, .(Dot)์„ ํ†ตํ•˜์—ฌ directory๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค Dot ๊ฐฏ์ˆ˜๋ณ„ directory ์œ„์น˜ - 1๊ฐœ: ์‹œ์ž‘์  directoy - 2๊ฐœ: ์ƒ์œ„ directory ํ•˜์ง€๋งŒ PEP 8์— ๋‚˜์™€์žˆ๋“ฏ, ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ importํ•˜๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. > ํŠนํžˆ๋‚˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ–ˆ์„๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ ์€ > file ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ๊ฒฝ๋กœ๋„ ๋‹ค์‹œ ์ง€์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค\! *** # `__init__.py` file์˜ ์—ญํ•  ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด `__init__.py` file์ด ๋ณด์ž…๋‹ˆ๋‹ค. `__init__.py` ์€ ํ•ด๋‹น directory๊ฐ€ package ์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ## ์ดˆ๊ธฐํ™” class ์„ ์–ธ ์‹œ `__init__`๋Š” magic method๋กœ์จ ์‚ฌ์šฉ๋˜๋ฉฐ, instance์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `__init__.py` ์€ directory ์ˆ˜์ค€(level)์—์„œ๋„ package์˜ ์ดˆ๊ธฐํ™” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค ### package๊ฐ€ import ๋  ๋•Œ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ • import ํ• ๋•Œ ๊ฒฝ๋กœ์˜ ์ด ๊ธธ์ด ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๊ณ  package์—์„œ import ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค > Python3.3 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” `__init__.py` file์ด ์—†์–ด๋„ ํŒจํ‚ค์ง€๋กœ ์ธ์‹ํ•˜์ง€๋งŒ ํ•˜์œ„ ๋ฒ„์ „ ํ˜ธํ™˜์„ ์œ„ํ•ด `__init__.py` file์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. *** # ์‹ค์Šต (calculator) ์ง์ ‘ ์‹คํ–‰(run) ํ•˜๋Š” module ์— ์ ํžˆ๋Š” import ๊ฒฝ๋กœ๋Š” ์ œ์•ฝ์‚ฌํ•ญ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค ์ œ์•ฝ์‚ฌํ•ญ์„ ์•Œ์•„๋ณด๊ธฐ์œ„ํ•ด ์‹ค์Šต์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต main.py ์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— main.py ์—์„œ import ๋ฅผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ํ–ˆ์„๋•Œ์™€ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ ํ–ˆ์„๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ### main.py ์˜ ์ ˆ๋Œ€๊ฒฝ๋กœ ![main.py ์˜ ์ ˆ๋Œ€๊ฒฝ๋กœ](https://media.vlpt.us/images/jiggyjiggy/post/8ae8cefa-c034-41c2-b5ae-5a7a5c036e1a/main%20absolute%20path.drawio.svg) ``` C:\Users\jigiseong\PycharmProjects\velog\venv\Scripts\python.exe C:/Users/jigiseong/PycharmProjects/velog/main.py 5 Process finished with exit code 0 ``` main.py ์—์„œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ•˜๊ณ  ์ง์ ‘ ์‹คํ–‰ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค ์œ„์น˜๋ฅผ ๋ชจ๋‘ ๋•Œ๋ ค ๋ฐ•์œผ๋‹ˆ ๋‹น์—ฐํžˆ ์ •์ƒ์ž‘๋™ ํ•˜๊ฒ ์ฃ ? ### main.py ์˜ ์ƒ๋Œ€๊ฒฝ๋กœ ? ์•„๋ž˜์˜ ๋„์‹์ฒ˜๋Ÿผ . velog ๋ผ๋Š” directory์—์„œ ![main.py ์˜ ์ƒ๋Œ€๊ฒฝ๋กœ ?](https://media.vlpt.us/images/jiggyjiggy/post/f5702fd9-4b25-481c-9b7b-2f241ae41b58/main%20relative%20path.drawio%20\(1\).svg) ``` C:\Users\jigiseong\PycharmProjects\velog\venv\Scripts\python.exe C:/Users/jigiseong/PycharmProjects/velog/main.py Traceback (most recent call last): File "C:\Users\jigiseong\PycharmProjects\velog\main.py", line 5, in <module> from .calculator.add_and_multiply import add_and_multiply ImportError: attempted relative import with no known parent package Process finished with exit code 1 ``` > ImportError: attempted relative import with no known parent package main.py ์—์„œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ์•Œ๋ ค์ง„ ์ƒ์œ„ ํŒจํ‚ค์ง€๊ฐ€ ์—†๋Š” ์ƒ๋Œ€ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ๋„๋ผ๋Š” importError ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. (์ฆ‰ entry point๊ฐ€ velog๊ฐ€ ์•„๋‹Œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค) > "main.py๋Š” velog ํŒจํ‚ค์ง€ ๋งž๋Š”๋ฐ;; ์™ธ์•Š๋˜;;;" ## ์ƒ๋Œ€ ๊ฒฝ๋กœ์—์„œ ์‹œ์ž‘์  directory๋ฅผ velog๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋Š” ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” module์€, ์ด๋ฆ„์ด `"__main__"` ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค ๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด > Note that relative imports are based on the name of the current module. Since the name of the main module is always `"__main__"`, modules intended for use as the main module of a Python application must always use absolute imports. > <https://docs.python.org/3/tutorial/modules.html#intra-package-references> > - ๊ฒฐ๋ก ๋งŒ ์ถ•์•ฝํ•ด๋ณด์ž๋ฉด > > "์ง์ ‘ ์‹คํ–‰ํ•  module์—์„œ๋Š” ํ•ญ์ƒ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ•ด์•ผํ•œ๋‹ค" ์ž…๋‹ˆ๋‹ค ์ด์œ ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„  1. Python ์—๋Š” module๋ผ๋Š” Data model ์—๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ์†์„ฑ:`__name__` ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ๊ณผ 1. ์ƒ๋Œ€๊ฒฝ๋กœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ธฐ์ค€์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค > module์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์†์„ฑ:`__name__` ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค > <https://docs.python.org/3/reference/datamodel.html#special-method-names> > The `__name__` attribute must be set to the fully-qualified name of the module. > This name is used to uniquely identify the module in the import system. > <https://docs.python.org/3/reference/import.html#import-related-module-attributes> ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ด์œ ๋ฅผ ์ˆœ๋ฒˆ์— ๋งž์ถฐ ์„œ์ˆ ํ•ด ๋ดค์Šต๋‹ˆ๋‹ค. 1. module์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์†์„ฑ์œผ๋กœ `__name__` ์†์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. `__name__` ์†์„ฑ์— ์— module ์˜ ์ด๋ฆ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” module์€, ์ด๋ฆ„์ด `__main__` ์ด ์ €์žฅ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ `__name__` = `"__main__"` ์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค 2. ์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” ํ•ด๋‹น ์†์„ฑ์„ ํ†ตํ•ด (`__name__` ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๋ฌธ์ž์—ด์„ ํ†ตํ•ด) ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค > ์ฆ‰, ์ง์ ‘ ์‹คํ–‰๋˜๋Š” module์€ ์›๋ž˜์˜ ์œ„์น˜๊ฐ€ ์•„๋‹Œ `"__main__"` ์— ํ•ด๋‹นํ•˜๋Š” ์œ„์น˜๋กœ ๊ณ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์“ธ ์ˆ˜ ์—†๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค\! "์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”๋†“๊ณ  ์˜ˆ์ „ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์จ๋‘๋‹ˆ ๋ ๋ฆฌ๊ฐ€ ์—†๊ฒ ์ฃ ?" ![์ƒํ•˜์ขŒ์šฐ](https://media.vlpt.us/images/jiggyjiggy/post/75c8871f-0f01-42c6-8228-93f7ed4e9a7f/%EC%83%81%ED%95%98%EC%A2%8C%EC%9A%B0.drawio%20\(1\).svg) ``` jiggyjiggy : "a์•ผ, ์šฐ์ธก์œผ๋กœ 1์นธ, ์•„๋ž˜๋กœ 1์นธ ์ด๋™ํ•˜๋ฉด ๋ˆ„๊ฐ€์žˆ์ง€?" a: "f๊ฐ€ ์žˆ์ง€" ``` ![์ƒํ•˜์ขŒ์šฐ ๊ธฐ์ค€์  ๋ฐ”๋€œ](https://media.vlpt.us/images/jiggyjiggy/post/51bb03b0-e92b-4eea-a38a-8248ef21f427/%EC%83%81%ED%95%98%EC%A2%8C%EC%9A%B0%20%EA%B8%B0%EC%A4%80%20%EB%B0%94%EB%80%9C.drawio%20\(1\).svg) ``` jiggyjiggy : "a์•ผ, ์šฐ์ธก์œผ๋กœ 1์นธ, ์•„๋ž˜๋กœ 1์นธ ์ด๋™ํ•˜๋ฉด ๋ˆ„๊ฐ€์žˆ์ง€?" a: "์•„๋ฌด๋„ ์—†์ง€;;" ``` *** ## ์ง์ ‘ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” module์—์„œ์˜ import ๊ฒฝ๋กœ ์ง์ ‘ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” module์—์„œ์˜ import ๊ฒฝ๋กœ๋Š” ์ ˆ๋Œ€๊ฒฝ๋กœ, ์ƒ๋Œ€๊ฒฝ๋กœ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— `__name__` ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๊ฒ ์ฃ ? ใ…Žใ…Ž ํ•˜์ง€๋งŒ PEP 8์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ, ์ƒ๋Œ€๊ฒฝ๋กœ๋Š” file์˜ ์œ„์น˜๊ฐ€ ๋ณ€ํ•œ๋‹ค๋ฉด ๋ฐ”๋€Œ๋Š” ๊ฒฝ๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์€ ์Šต๊ด€์ž…๋‹ˆ๋‹ค *** #### ๋ฒˆ์™ธ. Python code๋ฅผ ๋ณด๋‹ค๋ณด๋ฉด ``` if __name__ == '__main__': ``` ๋ฅผ ์ž์ฃผ ์ ‘ํ•˜์…จ์„ ๊ฒ๋‹ˆ๋‹ค import ํ–ˆ๋Š”๋ฐ ํ•ด๋‹น ํŒŒ์ผ์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์žˆ๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค ๋งํฌ๋กœ ๋นผ ~~**๋งํฌ**~~ [![profile](https://velog.velcdn.com/images/jiggyjiggy/profile/3a09e60c-2e1b-4600-a239-64607b0f2a9d/social.png)](https://velog.io/@jiggyjiggy/posts) [์ง€๊ธฐ์„ฑ](https://velog.io/@jiggyjiggy/posts) ๊ถ๊ธˆ์ฆ ์ฃผ๋„ ๊ณต๋ถ€ / ์›๋ฆฌ ํŒŒ๊ณ ๋“ค๊ธฐ / ๊ฒฝํ—˜์— ๊ธฐ๋ฐ˜ํ•œ ๋ธ”๋กœ๊ทธ ํŒ”๋กœ์šฐ [์ด์ „ ํฌ์ŠคํŠธ \[Python\] Import Searching Flow](https://velog.io/@jiggyjiggy/Python-Import-Searching-Flow) [๋‹ค์Œ ํฌ์ŠคํŠธ ๋‚˜์˜ ๊ณต๋ถ€ ๊ฒฝํ—˜๋‹ด๊ณผ args, kwargs, \*args, \*\*kwargs](https://velog.io/@jiggyjiggy/%EB%82%98%EC%9D%98-%EA%B3%B5%EB%B6%80%EB%B2%95%EA%B3%BC-args-kwargs-args-kwargs) #### 0๊ฐœ์˜ ๋Œ“๊ธ€ ๋Œ“๊ธ€ ์ž‘์„ฑ
Readable Markdown
## absolute path ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์™„์ „ํ•œ ํ˜•ํƒœ์˜ ๊ฒฝ๋กœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค ## relative path import ํ•˜๋Š” ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ๋Œ€์ ์ธ ๊ฒฝ๋กœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค ## absolute path์™€ relative path๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? > Absolute imports are recommended, as they are usually more readable and tend to be better behaved (or at least give better error messages) if the import system is incorrectly configured (such as when a directory inside a package ends up on sys.path) > > However, explicit relative imports are an acceptable alternative to absolute imports, especially when dealing with complex package layouts where using absolute imports would be unnecessarily verbose > > <https://peps.python.org/pep-0008/#imports> ๊ณต์‹๋ฌธ์„œ(PEP8)์— ๋”ฐ๋ฅด๋ฉด 1. ์ ˆ๋Œ€ ๊ฒฝ๋กœ(absolute path)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค 2. ๋‹ค๋งŒ, ๊ฐ™์€ package ์†์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฅํ™ฉํ•œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ผ๋ฉด ์ƒ๋Œ€ ๊ฒฝ๋กœ(relative path)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ๊ณ  ์“ฐ์—ฌ์žˆ์Šต๋‹ˆ๋‹ค *** PEP (Python Enhancement Proposal) ~~**๋งํฌ**~~ PEP 8 ~~**๋งํฌ**~~ *** ## ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค my\_app ์ด๋ผ๋Š” project๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฌ๋Ÿฌ directory์™€ file์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค ![hierachy structure](https://media.vlpt.us/images/jiggyjiggy/post/a084b0ef-7398-4a4f-9f6c-19264a0d3aee/hierachy%20file%20structure.drawio%20\(3\).svg) ## absolute path ์œ„ ๊ตฌ์กฐ์—์„œ main.py ์— module1.py ์™€ module5.py ๋ฅผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด import ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ![absolute path](https://media.vlpt.us/images/jiggyjiggy/post/ff2317a5-74fa-4392-9e0d-5222b03dec24/hierachy%20file%20structure%20absolute%20import.drawio%20\(4\).svg) ``` # main.py from package1 import module1 from package2.subpackage import module5 ``` ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ์‹œ my\_app ์€ ์ƒ๋žต๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. my\_app์ด ์‹œ์ž‘์ (entry point) ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ์‹œ ์‹œ์ž‘์ ์€ project directory ์ž…๋‹ˆ๋‹ค my\_app ์ด๋ผ๋Š” project๋ฅผ ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ sys.path์— ์š”์†Œ์— ์ถ”๊ฐ€๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— my\_app directory๊ฐ€ ์‹œ์ž‘์ ์œผ๋กœ ์„ค์ •๋˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค *** project directory์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ sys.path์— ์š”์†Œ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. import search flow ~~**๋งํฌ**~~ *** ## relative path ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด my\_app directory์— new\_module.py๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค module4์—์„œ ํ˜„์žฌ directoty์˜ module4.py ์™€ ํ•˜์œ„ directory์ธ subpackage์˜ module5.py์™€ ์ƒ์œ„ directory์˜ new\_module.py ๋ฅผ importํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ![relative path](https://media.vlpt.us/images/jiggyjiggy/post/b1b0b532-5f28-46a1-ab18-8a7bc2f8b075/relative%20path.drawio%20\(3\).svg) ``` # module3.py from . import module4 from .subpackage import module5 from .. import new_module ``` import ํ•˜๋Š” file์˜ directory๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์žก์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ package2๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ์จ, .(Dot)์„ ํ†ตํ•˜์—ฌ directory๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค Dot ๊ฐฏ์ˆ˜๋ณ„ directory ์œ„์น˜ - 1๊ฐœ: ์‹œ์ž‘์  directoy - 2๊ฐœ: ์ƒ์œ„ directory ํ•˜์ง€๋งŒ PEP 8์— ๋‚˜์™€์žˆ๋“ฏ, ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ importํ•˜๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. > ํŠนํžˆ๋‚˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ–ˆ์„๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ ์€ > file ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ๊ฒฝ๋กœ๋„ ๋‹ค์‹œ ์ง€์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค\! *** ## `__init__.py` file์˜ ์—ญํ•  ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด `__init__.py` file์ด ๋ณด์ž…๋‹ˆ๋‹ค. `__init__.py` ์€ ํ•ด๋‹น directory๊ฐ€ package ์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ## ์ดˆ๊ธฐํ™” class ์„ ์–ธ ์‹œ `__init__`๋Š” magic method๋กœ์จ ์‚ฌ์šฉ๋˜๋ฉฐ, instance์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `__init__.py` ์€ directory ์ˆ˜์ค€(level)์—์„œ๋„ package์˜ ์ดˆ๊ธฐํ™” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค ### package๊ฐ€ import ๋  ๋•Œ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ • import ํ• ๋•Œ ๊ฒฝ๋กœ์˜ ์ด ๊ธธ์ด ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๊ณ  package์—์„œ import ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค > Python3.3 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” `__init__.py` file์ด ์—†์–ด๋„ ํŒจํ‚ค์ง€๋กœ ์ธ์‹ํ•˜์ง€๋งŒ ํ•˜์œ„ ๋ฒ„์ „ ํ˜ธํ™˜์„ ์œ„ํ•ด `__init__.py` file์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. *** ## ์‹ค์Šต (calculator) ์ง์ ‘ ์‹คํ–‰(run) ํ•˜๋Š” module ์— ์ ํžˆ๋Š” import ๊ฒฝ๋กœ๋Š” ์ œ์•ฝ์‚ฌํ•ญ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค ์ œ์•ฝ์‚ฌํ•ญ์„ ์•Œ์•„๋ณด๊ธฐ์œ„ํ•ด ์‹ค์Šต์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต main.py ์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— main.py ์—์„œ import ๋ฅผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ํ–ˆ์„๋•Œ์™€ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ ํ–ˆ์„๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ### main.py ์˜ ์ ˆ๋Œ€๊ฒฝ๋กœ ![main.py ์˜ ์ ˆ๋Œ€๊ฒฝ๋กœ](https://media.vlpt.us/images/jiggyjiggy/post/8ae8cefa-c034-41c2-b5ae-5a7a5c036e1a/main%20absolute%20path.drawio.svg) ``` C:\Users\jigiseong\PycharmProjects\velog\venv\Scripts\python.exe C:/Users/jigiseong/PycharmProjects/velog/main.py 5 Process finished with exit code 0 ``` main.py ์—์„œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ•˜๊ณ  ์ง์ ‘ ์‹คํ–‰ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค ์œ„์น˜๋ฅผ ๋ชจ๋‘ ๋•Œ๋ ค ๋ฐ•์œผ๋‹ˆ ๋‹น์—ฐํžˆ ์ •์ƒ์ž‘๋™ ํ•˜๊ฒ ์ฃ ? ### main.py ์˜ ์ƒ๋Œ€๊ฒฝ๋กœ ? ์•„๋ž˜์˜ ๋„์‹์ฒ˜๋Ÿผ . velog ๋ผ๋Š” directory์—์„œ ![main.py ์˜ ์ƒ๋Œ€๊ฒฝ๋กœ ?](https://media.vlpt.us/images/jiggyjiggy/post/f5702fd9-4b25-481c-9b7b-2f241ae41b58/main%20relative%20path.drawio%20\(1\).svg) ``` C:\Users\jigiseong\PycharmProjects\velog\venv\Scripts\python.exe C:/Users/jigiseong/PycharmProjects/velog/main.py Traceback (most recent call last): File "C:\Users\jigiseong\PycharmProjects\velog\main.py", line 5, in <module> from .calculator.add_and_multiply import add_and_multiply ImportError: attempted relative import with no known parent package Process finished with exit code 1 ``` > ImportError: attempted relative import with no known parent package main.py ์—์„œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ์•Œ๋ ค์ง„ ์ƒ์œ„ ํŒจํ‚ค์ง€๊ฐ€ ์—†๋Š” ์ƒ๋Œ€ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ๋„๋ผ๋Š” importError ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. (์ฆ‰ entry point๊ฐ€ velog๊ฐ€ ์•„๋‹Œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค) > "main.py๋Š” velog ํŒจํ‚ค์ง€ ๋งž๋Š”๋ฐ;; ์™ธ์•Š๋˜;;;" ## ์ƒ๋Œ€ ๊ฒฝ๋กœ์—์„œ ์‹œ์ž‘์  directory๋ฅผ velog๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋Š” ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” module์€, ์ด๋ฆ„์ด `"__main__"` ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค ๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด > Note that relative imports are based on the name of the current module. Since the name of the main module is always `"__main__"`, modules intended for use as the main module of a Python application must always use absolute imports. > <https://docs.python.org/3/tutorial/modules.html#intra-package-references> > - ๊ฒฐ๋ก ๋งŒ ์ถ•์•ฝํ•ด๋ณด์ž๋ฉด > > "์ง์ ‘ ์‹คํ–‰ํ•  module์—์„œ๋Š” ํ•ญ์ƒ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ import ํ•ด์•ผํ•œ๋‹ค" ์ž…๋‹ˆ๋‹ค ์ด์œ ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„  1. Python ์—๋Š” module๋ผ๋Š” Data model ์—๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ์†์„ฑ:`__name__` ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ๊ณผ 1. ์ƒ๋Œ€๊ฒฝ๋กœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ธฐ์ค€์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค > module์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์†์„ฑ:`__name__` ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค > <https://docs.python.org/3/reference/datamodel.html#special-method-names> > The `__name__` attribute must be set to the fully-qualified name of the module. > This name is used to uniquely identify the module in the import system. > <https://docs.python.org/3/reference/import.html#import-related-module-attributes> ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ด์œ ๋ฅผ ์ˆœ๋ฒˆ์— ๋งž์ถฐ ์„œ์ˆ ํ•ด ๋ดค์Šต๋‹ˆ๋‹ค. 1. module์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์†์„ฑ์œผ๋กœ `__name__` ์†์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. `__name__` ์†์„ฑ์— ์— module ์˜ ์ด๋ฆ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” module์€, ์ด๋ฆ„์ด `__main__` ์ด ์ €์žฅ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ `__name__` = `"__main__"` ์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค 2. ์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” ํ•ด๋‹น ์†์„ฑ์„ ํ†ตํ•ด (`__name__` ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๋ฌธ์ž์—ด์„ ํ†ตํ•ด) ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค > ์ฆ‰, ์ง์ ‘ ์‹คํ–‰๋˜๋Š” module์€ ์›๋ž˜์˜ ์œ„์น˜๊ฐ€ ์•„๋‹Œ `"__main__"` ์— ํ•ด๋‹นํ•˜๋Š” ์œ„์น˜๋กœ ๊ณ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์“ธ ์ˆ˜ ์—†๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค\! "์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”๋†“๊ณ  ์˜ˆ์ „ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์จ๋‘๋‹ˆ ๋ ๋ฆฌ๊ฐ€ ์—†๊ฒ ์ฃ ?" ![์ƒํ•˜์ขŒ์šฐ](https://media.vlpt.us/images/jiggyjiggy/post/75c8871f-0f01-42c6-8228-93f7ed4e9a7f/%EC%83%81%ED%95%98%EC%A2%8C%EC%9A%B0.drawio%20\(1\).svg) ``` jiggyjiggy : "a์•ผ, ์šฐ์ธก์œผ๋กœ 1์นธ, ์•„๋ž˜๋กœ 1์นธ ์ด๋™ํ•˜๋ฉด ๋ˆ„๊ฐ€์žˆ์ง€?" a: "f๊ฐ€ ์žˆ์ง€" ``` ![์ƒํ•˜์ขŒ์šฐ ๊ธฐ์ค€์  ๋ฐ”๋€œ](https://media.vlpt.us/images/jiggyjiggy/post/51bb03b0-e92b-4eea-a38a-8248ef21f427/%EC%83%81%ED%95%98%EC%A2%8C%EC%9A%B0%20%EA%B8%B0%EC%A4%80%20%EB%B0%94%EB%80%9C.drawio%20\(1\).svg) ``` jiggyjiggy : "a์•ผ, ์šฐ์ธก์œผ๋กœ 1์นธ, ์•„๋ž˜๋กœ 1์นธ ์ด๋™ํ•˜๋ฉด ๋ˆ„๊ฐ€์žˆ์ง€?" a: "์•„๋ฌด๋„ ์—†์ง€;;" ``` *** ## ์ง์ ‘ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” module์—์„œ์˜ import ๊ฒฝ๋กœ ์ง์ ‘ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” module์—์„œ์˜ import ๊ฒฝ๋กœ๋Š” ์ ˆ๋Œ€๊ฒฝ๋กœ, ์ƒ๋Œ€๊ฒฝ๋กœ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— `__name__` ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๊ฒ ์ฃ ? ใ…Žใ…Ž ํ•˜์ง€๋งŒ PEP 8์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ, ์ƒ๋Œ€๊ฒฝ๋กœ๋Š” file์˜ ์œ„์น˜๊ฐ€ ๋ณ€ํ•œ๋‹ค๋ฉด ๋ฐ”๋€Œ๋Š” ๊ฒฝ๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์€ ์Šต๊ด€์ž…๋‹ˆ๋‹ค *** #### ๋ฒˆ์™ธ. Python code๋ฅผ ๋ณด๋‹ค๋ณด๋ฉด ``` if __name__ == '__main__': ``` ๋ฅผ ์ž์ฃผ ์ ‘ํ•˜์…จ์„ ๊ฒ๋‹ˆ๋‹ค import ํ–ˆ๋Š”๋ฐ ํ•ด๋‹น ํŒŒ์ผ์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์žˆ๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค ๋งํฌ๋กœ ๋นผ ~~**๋งํฌ**~~
Shard105 (laksa)
Root Hash10166624061664201905
Unparsed URLio,velog!/@jiggyjiggy/Python-import-path-absolute-path-relative-path-name-main s443