<jupyter_start><jupyter_text>패키지 - package- 패키지는 디렉토리와 모듈로 구성되어 있습니다.- 패키지에서 디렉토리에는 `__init__.py` 파일이 있어야 합니다. (python3.3 버전 이후에는 없어도 됩니다.)    - 하지만 호환성을 위해서 반드시 파일을 추가해 주세요. 1. 디렉토리 만들기2. __init__ 파일 추가3. 모듈 작성4. import5. alias6. from import7. __init__.py8. default import package path9. setuptools : 패키지 만들어 설치하기  1. 디렉토리 만들기 윈도우는 디렉토리 구분을 `\`로 해주세요. 윈도우는 아래의 명령으로 생성해주세요```!mkdir calc!mkdir calc\pm  plus, minus!mkdir calc\md  multiply, division```<jupyter_code>!rm -rf calc
!mkdir -p calc/pm
!mkdir -p calc/md<jupyter_output><empty_output><jupyter_text>tree 가 설치되어 있지 않으면 아래의 명령이 실행되지 않습니다.- mac 설치방법 : brew install tree<jupyter_code>!tree calc<jupyter_output>[01;34mcalc[00m
├── [01;34mmd[00m
└── [01;34mpm[00m

2 directories, 0 files<jupyter_text>2. \_\_init\_\_ 파일 추가<jupyter_code>!touch calc/__init__.py
!touch calc/pm/__init__.py
!touch calc/md/__init__.py
!tree calc<jupyter_output>[01;34mcalc[00m
├── __init__.py
├── [01;34mmd[00m
│   └── __init__.py
└── [01;34mpm[00m
    └── __init__.py

2 directories, 3 files<jupyter_text>3. 모듈 작성<jupyter_code>%%writefile calc/pm/plus.py

def plus_func(*args):
    print("plus")
    return sum(args)
%%writefile calc/pm/minus.py

def minus_func(num1, num2):
    print("minus")
    return num1 - num2
from functools import reduce
ls = [3, 1, 5, 2, 4]

reduce(lambda x, y: x + y, ls)
from functools import reduce

def multiply_func(*args):
    return reduce(lambda x, y: x * y, args)

multiply_func(1, 2, 3, 4, 5)
%%writefile calc/md/multiply.py
from functools import reduce

def multiply_func(*args):
    print("multiply")
    return reduce(lambda x, y: x * y, args)
%%writefile calc/md/division.py

def division_func(num1, num2):
    print("division")
    return num1 / num2
!tree calc
%reset<jupyter_output>Once deleted, variables cannot be recovered. Proceed (y/[n])? y<jupyter_text>4. import 모듈, 패키지import에서 가장 마지막은 모듈이어야 합니다.<jupyter_code>import calc.pm.plus
%whos
calc.pm.plus.plus_func(1, 2, 3)<jupyter_output>plus<jupyter_text>5. alias`as` 예약어로 alias를 사용하면 길이가 긴 모듈이름을 줄일수 있습니다.<jupyter_code>import calc.pm.plus as alias
alias.plus_func(1, 2, 3)
import calc.md.division as div
div.division_func(10, 2)
%reset<jupyter_output>Once deleted, variables cannot be recovered. Proceed (y/[n])? 
Nothing done.<jupyter_text>6. from을 이용하여 모듈을 import`from`을 이용하여 모듈을 import```    from (패키지) import (모듈)```<jupyter_code>from calc.md import multiply
multiply.multiply_func(2, 3, 4)<jupyter_output>multiply<jupyter_text>7. \_\_init\_\_.py`__all__` 변수에 리스트로 import할 모듈의 이름을 나열하면 모듈의 import를 `import *`로 import할때 나열된 모듈만 import 됩니다. calc.md의 multiply, division 모듈을 import<jupyter_code>%%writefile calc/md/__init__.py

__all__ = ["multiply", "division"]
# __all__ 파일을 변경후에는 kernel restart를 해줘야 정상적으로 적용됩니다.
from calc.md import *
%whos<jupyter_output>Variable   Type      Data/Info
------------------------------
alias      module    <module 'calc.pm.plus' fr<...>on/test/calc/pm/plus.py'>
calc       module    <module 'calc' from '/Use<...>n/test/calc/__init__.py'>
div        module    <module 'calc.md.division<...>est/calc/md/division.py'>
division   module    <module 'calc.md.division<...>est/calc/md/division.py'>
multiply   module    <module 'calc.md.multiply<...>est/calc/md/multiply.py'><jupyter_text>python의 data2 모듈을 import<jupyter_code>%%writefile calc/md/__init__.py

__all__ = ["division"]
# __all__ 파일을 변경후에는 kernel restart를 해줘야 정상적으로 적용됩니다.
from calc.md import *
%whos<jupyter_output>Variable   Type      Data/Info
------------------------------
alias      module    <module 'calc.pm.plus' fr<...>on/test/calc/pm/plus.py'>
calc       module    <module 'calc' from '/Use<...>n/test/calc/__init__.py'>
div        module    <module 'calc.md.division<...>est/calc/md/division.py'>
division   module    <module 'calc.md.division<...>est/calc/md/division.py'>
multiply   module    <module 'calc.md.multiply<...>est/calc/md/multiply.py'><jupyter_text>8. default import package path- 기본적으로 python에 있는 패키지의 경로와 어떤 default 패키지들이 있는지 확인합니다.<jupyter_code>import sys

for path in sys.path:
    print(path)
# 패키지 확인
packages = !ls /usr/local/anaconda3/lib/python3.7
len(packages)
print(packages[-10:])<jupyter_output>['warnings.py', 'wave.py', 'weakref.py', 'webbrowser.py', 'wsgiref', 'xdrlib.py', 'xml', 'xmlrpc', 'zipapp.py', 'zipfile.py']<jupyter_text>.py가 들어가고 가장 앞이 _가 없는 패키지를 필터링<jupyter_code>packages = [
    package
    for package in packages
    if package.endswith(".py") and package[0] != "_"
]
len(packages)
# random.py 가 있는지 확인
"random.py" in packages<jupyter_output><empty_output><jupyter_text>9. 패키지 만들어 설치하기 - setuptools- setuptools 모듈을 이용하여 내가 만든 패키지를 설치할수 있습니다.    - `https://pypi.org/project/setuptools/`- 실제 pip에 업로드를 하려면 `https://pypi.org/` 에 계정을 만들어 테스트를 통과 한후에 업로드를 해야 합니다. 1. mypack 패키지 생성2. setup.py 설정3. mypack 모듈 만들기4. 패키지 구조확인5. 패키지 설치6. 패키지 설치 확인7. 다른 경로에서 아래와 같이 코드 실행해도 코드 동작 확인8. 패키지 언인스톨  1. mypack 패키지 생성<jupyter_code>!rm -rf mypack
!mkdir -p mypack/mypack
!mkdir -p mypack/mypack/mypack1
!mkdir -p mypack/mypack/mypack2
!touch mypack/setup.py<jupyter_output><empty_output><jupyter_text>2. setup.py 설정<jupyter_code>%%writefile mypack/setup.py

from setuptools import setup, find_packages

setup(
    name='mypack',
    version='0.0.1',
    author='DoojinPark',
    author_email='<EMAIL>',
    packages=find_packages(),
    include_package_data=True,
)<jupyter_output>Overwriting mypack/setup.py<jupyter_text>3. mypack 모듈 만들기<jupyter_code>%%writefile mypack/mypack/mypack1/calc1.py

def plus(num1, num2):
    print("mypack1 plus")
    return num1 + num2
%%writefile mypack/mypack/mypack2/calc2.py

def minus(num1, num2):
    print("mypack2 minus")
    return num1 + num2
%%writefile mypack/mypack/__init__.py

from .mypack1.calc1 import plus
from .mypack2.calc2 import minus<jupyter_output>Writing mypack/mypack/__init__.py<jupyter_text>4. 패키지 구조확인<jupyter_code>!tree mypack<jupyter_output>[01;34mmypack[00m
├── [01;34mmypack[00m
│   ├── __init__.py
│   ├── [01;34mmypack1[00m
│   │   └── calc1.py
│   └── [01;34mmypack2[00m
│       └── calc2.py
└── setup.py

3 directories, 4 files<jupyter_text>5. 패키지 설치<jupyter_code>!pip install -e mypack/<jupyter_output>Obtaining file:///Users/rada/Documents/lecture/dss/dss_15/01_python/test/mypack
Installing collected packages: mypack
  Attempting uninstall: mypack
    Found existing installation: mypack 0.0.1
    Uninstalling mypack-0.0.1:
      Successfully uninstalled mypack-0.0.1
  Running setup.py develop for mypack
Successfully installed mypack<jupyter_text>6. 패키지 설치 확인<jupyter_code>!pip list | grep mypack<jupyter_output>mypack                            0.0.1               /Users/rada/Documents/lecture/dss/dss_15/01_python/test/mypack<jupyter_text>7. 다른 경로에서 아래와 같이 코드 실행해도 코드 동작 확인 ```import mypackresult = mypack.plus(1, 2)print(result)```  8. 패키지 언인스톨<jupyter_code>!pip uninstall -y mypack
!pip list | grep mypack<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14500505999710858, 'fraction_numerical': 0.027179413040335405, 'mean_word_length': 4.023965141612201, 'pattern_counts': {'":': 0, '<': 80, '<?xml version=': 0, '>': 80, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '18', 'dir': 'jupyter-structured-clean-dedup', 'id': '197500', 'license': 'MIT', 'n_tokens_mistral': 3397, 'n_tokens_neox': 3575, 'n_words': 644, 'path': 'python/io,regex,package,linked_list/03_package.ipynb', 'repo_name': 'yeonghwanchoi/TIL', 'size': '6927'}