Get started learning Python with DataCamp's free Intro to Python tutorial. Learn Data Science by completing interactive coding challenges and watching videos by expert instructors. Start Now!

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join 11 million other learners and get started learning Python for data science today!

Good news! You can save 25% off your Datacamp annual subscription with the code LEARNPYTHON23ALE25 - Click here to redeem your discount

모듈과 패키지


프로그래밍에서 모듈은 특정 기능을 가진 소프트웨어의 한 부분입니다. 예를 들어, 핑퐁 게임을 만들 때 하나의 모듈은 게임 로직을 담당하고 또 다른 모듈은 화면에 게임을 그리는 역할을 할 수 있습니다. 각 모듈은 각각 다른 파일로 구성되어 있으며, 별도로 편집할 수 있습니다.

모듈 작성

Python의 모듈은 .py 확장자를 가진 Python 파일일 뿐입니다. 모듈의 이름은 파일 이름과 동일합니다. Python 모듈에는 함수, 클래스 또는 변수의 집합이 정의되고 구현될 수 있습니다. 위 예제에는 두 개의 파일이 포함됩니다:

mygame/

  • mygame/game.py

  • mygame/draw.py

Python 스크립트 game.py는 게임을 구현합니다. 이는 draw.py 파일에서 draw_game 함수를 사용하며, 즉 화면에 게임을 그리는 로직을 구현한 draw 모듈을 사용합니다.

모듈은 import 명령어를 사용하여 다른 모듈에서 가져옵니다. 이 예제에서 game.py 스크립트는 다음과 같이 보일 수 있습니다:

```python

game.py

draw 모듈을 import합니다

import draw

def play_game(): ...

def main(): result = play_game() draw.draw_game(result)

이 스크립트가 실행되면

main()이 실행됩니다

if name == 'main': main() ```

draw 모듈은 다음과 같이 보일 수 있습니다:

```python

draw.py

def draw_game(): ...

def clear_screen(screen): ... ```

이 예제에서 game 모듈은 draw 모듈을 import하여 해당 모듈에 구현된 함수를 사용할 수 있도록 합니다. main 함수는 로컬 함수 play_game을 사용하여 게임을 실행한 다음, draw 모듈에 구현된 draw_game이라는 함수를 사용하여 게임 결과를 그립니다. draw 모듈의 draw_game 함수를 사용하려면 도트 연산자를 사용하여 함수가 구현된 모듈을 지정해야 합니다. game 모듈에서 draw_game 함수를 참조하려면 draw 모듈을 import한 다음 draw.draw_game()을 호출해야 합니다.

import draw 지시문이 실행될 때, Python 인터프리터는 스크립트가 실행되는 디렉터리에서 모듈 이름과 .py 접미사가 있는 파일을 찾습니다. 이 경우 draw.py를 찾게 됩니다. 파일이 발견되면 import됩니다. 발견되지 않으면 내장 모듈을 계속해서 찾습니다.

모듈을 import할 때 .pyc 파일이 생성된다는 것을 아마도 눈치챘을 것입니다. 이것은 컴파일된 Python 파일입니다. Python은 모듈이 로드될 때마다 파일을 파싱하지 않도록 Python 바이트코드로 파일을 컴파일합니다. .pyc 파일이 존재하면 .py 파일 대신 로드됩니다. 이 과정은 사용자에게 투명하게 이루어집니다.

현재 네임스페이스에 모듈 객체 import

네임스페이스는 Python에서 각 객체에 이름이 부여되고 접근할 수 있는 시스템입니다. 우리는 from 명령어를 사용하여 함수 draw_game을 메인 스크립트의 네임스페이스에 import합니다.

```python

game.py

draw 모듈을 import합니다

from draw import draw_game

def main(): result = play_game() draw_game(result) ```

이 예제에서 모듈 이름이 draw_game 앞에 오지 않는 이유는 import 명령어를 사용하여 모듈 이름을 지정했기 때문입니다.

이 표기법의 장점은 모듈을 계속해서 참조할 필요가 없다는 것입니다. 그러나 네임스페이스는 같은 이름을 가진 두 개의 객체를 가질 수 없으므로 import 명령어가 네임스페이스의 기존 객체를 대체할 수 있습니다.

모듈의 모든 객체 import

import * 명령어를 사용하여 모듈의 모든 객체를 다음과 같이 import할 수 있습니다:

```python

game.py

draw 모듈을 import합니다

from draw import *

def main(): result = play_game() draw_game(result) ```

이 방법은 약간 위험할 수 있으며, 모듈의 수정이 import하는 모듈에 영향을 미칠 수 있지만 짧고 모듈에서 import하려는 모든 객체를 지정할 필요가 없습니다.

사용자 지정 import 이름

모듈은 원하는 이름으로 로드할 수 있습니다. 이것은 조건부로 모듈을 import하여 코드의 나머지 부분에서 동일한 이름을 사용할 때 유용합니다.

예를 들어, 약간 다른 이름을 가진 두 개의 draw 모듈이 있는 경우 다음과 같이 할 수 있습니다:

```python

game.py

draw 모듈을 import합니다

if visual_mode: # 시각 모드에서는 그래픽을 사용하여 그립니다 import draw_visual as draw else: # 텍스트 모드에서는 텍스트를 출력합니다. import draw_textual as draw

def main(): result = play_game() # visual_mode에 따라 시각적 또는 텍스트로 표시할 수 있습니다 draw.draw_game(result) ```

모듈 초기화

모듈이 실행 중인 Python 스크립트에 처음 로드될 때, 모듈 내의 코드를 한 번 실행하여 초기화됩니다. 코드에서 동일한 모듈을 다른 모듈이 다시 import하면 다시 로드되지 않으므로, 모듈 내부의 로컬 변수는 "싱글턴"처럼 작동하여 한 번만 초기화됩니다.

이를 사용하여 객체를 초기화할 수 있습니다. 예를 들어:

```python

draw.py

def draw_game(): # 화면을 지울 때 이 모듈에서 초기화된 기본 화면 객체를 사용할 수 있습니다 clear_screen(main_screen) ...

def clear_screen(screen): ...

class Screen(): ...

main_screen을 싱글턴으로 초기화합니다

main_screen = Screen() ```

모듈 로드 경로 확장

로컬 디렉터리 및 내장 모듈 외에도 Python 인터프리터가 모듈을 찾을 경로를 지정하는 몇 가지 방법이 있습니다. 환경 변수 PYTHONPATH를 사용하여 모듈을 찾을 추가 디렉토리를 다음과 같이 지정할 수 있습니다:

shell PYTHONPATH=/foo python game.py

이렇게 하면 game.py가 실행되며 스크립트는 로컬 디렉터리 뿐만 아니라 foo 디렉터리에서 모듈을 로드할 수 있습니다.

또한 sys.path.append 함수를 사용할 수 있습니다. import 명령어를 실행 하기 전에 실행합니다:

python sys.path.append("/foo")

이제 foo 디렉터리가 모듈을 찾을 경로 목록에 추가되었습니다.

내장 모듈 탐색

Python 표준 라이브러리에 있는 내장 모듈의 전체 목록은 여기에서 확인하십시오.

Python에서 모듈을 탐색할 때 매우 유용한 두 가지 중요한 함수는 dirhelp 함수입니다.

URL에서 데이터를 읽을 수 있도록 하는 urllib 모듈을 import하려면 다음과 같이 모듈을 import합니다:

```python

라이브러리 import

import urllib

사용

urllib.urlopen(...) ```

각 모듈에 구현된 함수가 무엇인지 dir 함수를 사용하여 확인할 수 있습니다:

```python

import urllib dir(urllib) ['ContentTooShortError', 'FancyURLopener', ..., 'urlopen', 'urlretrieve'] ```

모듈에서 사용하고자 하는 함수를 찾으면 Python 해석기를 사용하여 help 함수로 더 많은 정보를 읽을 수 있습니다:

python help(urllib.urlopen)

패키지 작성

패키지는 여러 패키지와 모듈을 포함하는 네임스페이스입니다. 특정 요구 사항이 있는 디렉터리일 뿐입니다.

Python의 각 패키지는 특수한 파일인 __init__.py가 포함된 디렉터리 여야 합니다. 이 파일은 비어있을 수 있으며, 해당 디렉터리가 Python 패키지임을 나타냅니다. 이렇게 하면 모듈처럼 import될 수 있습니다.

foo라는 디렉터리를 생성하여 패키지 이름을 지정하면, 그 안에 bar라는 모듈을 생성할 수 있습니다. 그런 다음 foo 디렉터리에 __init__.py 파일을 추가합니다.

bar 모듈을 사용하려면 두 가지 방법으로 import할 수 있습니다:

python import foo.bar

또는:

python from foo import bar

위의 첫 번째 예제에서는 bar 모듈에 접근할 때마다 foo 접두사를 사용해야 합니다. 두 번째 예제에서는 그렇지 않습니다. 왜냐하면 우리가 모듈을 현재 모듈의 네임스페이스에 import했기 때문입니다.

__init__.py 파일은 또한 __all__ 변수를 덮어씌워 패키지가 API로 내보내는 모듈을 결정하며, 다른 모듈을 내부적으로 유지합니다:

```python init.py:

all = ["bar"] ```

Exercise

이 연습에서는 re 모듈에 있는 'find'라는 단어를 포함하는 모든 함수의 알파벳순으로 정렬된 목록을 출력합니다.

import re # Your code goes here find_members = [] import re # Your code goes here find_members = [] for member in dir(re): if "find" in member: find_members.append(member) print(sorted(find_members)) test_object('find_members') success_msg('Great work!')

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join over a million other learners and get started learning Python for data science today!

Previous Tutorial Next Tutorial Take the Test
Copyright © learnpython.org. Read our Terms of Use and Privacy Policy