โน๏ธ Skipped - page is already crawled
| Filter | Status | Condition | Details |
|---|---|---|---|
| HTTP status | PASS | download_http_code = 200 | HTTP 200 |
| Age cutoff | PASS | download_stamp > now() - 6 MONTH | 0.5 months ago |
| History drop | PASS | isNull(history_drop_reason) | No drop reason |
| Spam/ban | PASS | fh_dont_index != 1 AND ml_spam_score = 0 | ml_spam_score=0 |
| Canonical | PASS | meta_canonical IS NULL OR = '' OR = src_unparsed | Not set |
| Property | Value |
|---|---|
| URL | https://velog.io/@jiggyjiggy/Python-import-path-absolute-path-relative-path-name-main |
| Last Crawled | 2026-03-25 01:33:34 (14 days ago) |
| First Indexed | 2022-04-05 23:34:05 (4 years ago) |
| HTTP Status Code | 200 |
| Meta Title | [Python] import path / absolute path, relative path / __name__, __main__ |
| Meta Description | import ๊ณผ์ ์ ๋ํด ์์๋ณด์ธ์: "๊ฒฝ๋ก" ํธ |
| Meta Canonical | null |
| 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)

## 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์ ๋ง๋ค์์ต๋๋ค
.svg)
## absolute path
์ ๊ตฌ์กฐ์์
main.py ์ module1.py ์ module5.py ๋ฅผ ์ ๋ ๊ฒฝ๋ก๋ฅผ ํตํด import ํด๋ณด๊ฒ ์ต๋๋ค
.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ํด๋ณด๊ฒ ์ต๋๋ค
.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 ์ ์ ๋๊ฒฝ๋ก

```
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์์
.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__"` ์ ํด๋นํ๋ ์์น๋ก ๊ณ์ฐ๋๊ธฐ ๋๋ฌธ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ธ ์ ์๋ ๊ฒ ์
๋๋ค\!
"์์น๋ฅผ ๋ฐ๊ฟ๋๊ณ ์์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์จ๋๋ ๋ ๋ฆฌ๊ฐ ์๊ฒ ์ฃ ?"
.svg)
```
jiggyjiggy : "a์ผ, ์ฐ์ธก์ผ๋ก 1์นธ, ์๋๋ก 1์นธ ์ด๋ํ๋ฉด ๋๊ฐ์์ง?"
a: "f๊ฐ ์์ง"
```
.svg)
```
jiggyjiggy : "a์ผ, ์ฐ์ธก์ผ๋ก 1์นธ, ์๋๋ก 1์นธ ์ด๋ํ๋ฉด ๋๊ฐ์์ง?"
a: "์๋ฌด๋ ์์ง;;"
```
***
## ์ง์ ์คํ๋์ง ์๋ module์์์ import ๊ฒฝ๋ก
์ง์ ์คํ๋์ง ์๋ module์์์ import ๊ฒฝ๋ก๋ ์ ๋๊ฒฝ๋ก, ์๋๊ฒฝ๋ก ์๊ด ์์ต๋๋ค.
์ง์ ์คํ๋์ง ์์๊ธฐ ๋๋ฌธ์ `__name__` ์์ฑ์ด ๋ณ๊ฒฝ๋์ง ์๊ธฐ ๋๋ฌธ์ด๊ฒ ์ฃ ? ใ
ใ
ํ์ง๋ง PEP 8์์ ์ธ๊ธํ๋ฏ,
์๋๊ฒฝ๋ก๋ file์ ์์น๊ฐ ๋ณํ๋ค๋ฉด ๋ฐ๋๋ ๊ฒฝ๋ก์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ๊ฒฝ๋ก๋ก ์ฐ๋ ๊ฒ์ด ์ข์ ์ต๊ด์
๋๋ค
***
#### ๋ฒ์ธ.
Python code๋ฅผ ๋ณด๋ค๋ณด๋ฉด
```
if __name__ == '__main__':
```
๋ฅผ ์์ฃผ ์ ํ์
จ์ ๊ฒ๋๋ค
import ํ๋๋ฐ ํด๋น ํ์ผ์ ํจ์ ํธ์ถ์ด ์๋ค๋ฉด ๊ทธ๋๋ก ์คํ๋ฉ๋๋ค
๋งํฌ๋ก ๋นผ ~~**๋งํฌ**~~
[](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์ ๋ง๋ค์์ต๋๋ค
.svg)
## absolute path
์ ๊ตฌ์กฐ์์
main.py ์ module1.py ์ module5.py ๋ฅผ ์ ๋ ๊ฒฝ๋ก๋ฅผ ํตํด import ํด๋ณด๊ฒ ์ต๋๋ค
.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ํด๋ณด๊ฒ ์ต๋๋ค
.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 ์ ์ ๋๊ฒฝ๋ก

```
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์์
.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__"` ์ ํด๋นํ๋ ์์น๋ก ๊ณ์ฐ๋๊ธฐ ๋๋ฌธ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ธ ์ ์๋ ๊ฒ ์
๋๋ค\!
"์์น๋ฅผ ๋ฐ๊ฟ๋๊ณ ์์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์จ๋๋ ๋ ๋ฆฌ๊ฐ ์๊ฒ ์ฃ ?"
.svg)
```
jiggyjiggy : "a์ผ, ์ฐ์ธก์ผ๋ก 1์นธ, ์๋๋ก 1์นธ ์ด๋ํ๋ฉด ๋๊ฐ์์ง?"
a: "f๊ฐ ์์ง"
```
.svg)
```
jiggyjiggy : "a์ผ, ์ฐ์ธก์ผ๋ก 1์นธ, ์๋๋ก 1์นธ ์ด๋ํ๋ฉด ๋๊ฐ์์ง?"
a: "์๋ฌด๋ ์์ง;;"
```
***
## ์ง์ ์คํ๋์ง ์๋ module์์์ import ๊ฒฝ๋ก
์ง์ ์คํ๋์ง ์๋ module์์์ import ๊ฒฝ๋ก๋ ์ ๋๊ฒฝ๋ก, ์๋๊ฒฝ๋ก ์๊ด ์์ต๋๋ค.
์ง์ ์คํ๋์ง ์์๊ธฐ ๋๋ฌธ์ `__name__` ์์ฑ์ด ๋ณ๊ฒฝ๋์ง ์๊ธฐ ๋๋ฌธ์ด๊ฒ ์ฃ ? ใ
ใ
ํ์ง๋ง PEP 8์์ ์ธ๊ธํ๋ฏ,
์๋๊ฒฝ๋ก๋ file์ ์์น๊ฐ ๋ณํ๋ค๋ฉด ๋ฐ๋๋ ๊ฒฝ๋ก์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ๊ฒฝ๋ก๋ก ์ฐ๋ ๊ฒ์ด ์ข์ ์ต๊ด์
๋๋ค
***
#### ๋ฒ์ธ.
Python code๋ฅผ ๋ณด๋ค๋ณด๋ฉด
```
if __name__ == '__main__':
```
๋ฅผ ์์ฃผ ์ ํ์
จ์ ๊ฒ๋๋ค
import ํ๋๋ฐ ํด๋น ํ์ผ์ ํจ์ ํธ์ถ์ด ์๋ค๋ฉด ๊ทธ๋๋ก ์คํ๋ฉ๋๋ค
๋งํฌ๋ก ๋นผ ~~**๋งํฌ**~~ |
| Shard | 105 (laksa) |
| Root Hash | 10166624061664201905 |
| Unparsed URL | io,velog!/@jiggyjiggy/Python-import-path-absolute-path-relative-path-name-main s443 |