파이썬 PyPI (PIP) 프로젝트 안에 패키지 만들기

Jay
7 min readFeb 18, 2019

--

파이썬 패키지 배포를 하면서 알게 된 것. 그것은 바로 프로젝트 !=패키지 != 모듈

  • PyPI에서 pip install X , python에서 from Y import Z X는 프로젝트, Y는 패키지, Z는 모듈. 이렇게 생각하면 편함. 100% 맞는 말은 아님
  • 패키지는 __init__.py가 포함된 폴더의 폴더 이름, 그 폴더안에 포함된 main.py 같은 python 파일

사건의 발단

ypcc 패키지를 설치했는데 왜 import ypcc가 작동을 안하지?

이 상태로 패키지를 만들면
성공적인 인스톨에도 불구하고
모듈이 존재하지 않는다고 나온다
\Lib\site-packages 에는 ypcc 모듈이 없다!

사건의 해답을 찾아서.

그래서 다른 모듈을 살펴 본 결과, setup.py가 존재하는 디렉토리에 ypcc라는 폴더를 만들고 __init__.py를 생성해주면 되지 않을까 라는 결론을 얻었다.

ypcc 폴더 아래 __init__.py를 추가해준 모습
python setup.py bdist_wheel

이렇게 하니 빌드 때부터 기존에 봤던 것 과는 다르게 커맨트창에 나오는 줄의 숫자가 다르다!

(packer) C:\Users\jeakwon\Desktop\git\ypcc>python setup.py bdist_wheel
running bdist_wheel
running build
running build_py
creating build
creating build\lib
creating build\lib\ypcc
copying ypcc\__init__.py -> build\lib\ypcc
installing to build\bdist.win-amd64\wheel
running install
running install_lib
creating build\bdist.win-amd64
creating build\bdist.win-amd64\wheel
creating build\bdist.win-amd64\wheel\ypcc
copying build\lib\ypcc\__init__.py -> build\bdist.win-amd64\wheel\.\ypcc
running install_egg_info
running egg_info
creating ypcc.egg-info
writing ypcc.egg-info\PKG-INFO
writing dependency_links to ypcc.egg-info\dependency_links.txt
writing requirements to ypcc.egg-info\requires.txt
writing top-level names to ypcc.egg-info\top_level.txt
writing manifest file 'ypcc.egg-info\SOURCES.txt'
reading manifest file 'ypcc.egg-info\SOURCES.txt'
writing manifest file 'ypcc.egg-info\SOURCES.txt'
Copying ypcc.egg-info to build\bdist.win-amd64\wheel\.\ypcc-0.7.0-py3.7.egg-info
running install_scripts
adding license file "LICENSE" (matched pattern "LICEN[CS]E*")
creating build\bdist.win-amd64\wheel\ypcc-0.7.0.dist-info\WHEEL
creating 'dist\ypcc-0.7.0-py3-none-any.whl' and adding 'build\bdist.win-amd64\wheel' to it
adding 'ypcc/__init__.py'
adding 'ypcc-0.7.0.dist-info/LICENSE'
adding 'ypcc-0.7.0.dist-info/METADATA'
adding 'ypcc-0.7.0.dist-info/WHEEL'
adding 'ypcc-0.7.0.dist-info/top_level.txt'
adding 'ypcc-0.7.0.dist-info/RECORD'
removing build\bdist.win-amd64\wheel

위쪽부분에 copying build\lib\ypcc\__init__.py -> build\bdist.win-amd64\wheel\.\ypcc 이 부분이 모듈을 생성해주는 부분인가?

twine upload dist\ypcc-0.7.0-py3-none-any.whl

twine을 통해서 업로드까지 해주고

(packer) C:\Users\jeakwon\Desktop\git\ypcc>twine upload dist\ypcc-0.7.0-py3-none-any.whl
Enter your username: jeakwon
Enter your password:
Uploading distributions to https://upload.pypi.org/legacy/
Uploading ypcc-0.7.0-py3-none-any.whl
100%|█████████████████████████████████████████████████████████████████████████████| 6.45k/6.45k [00:00<00:00, 8.03kB/s]
새버전을 설치해준 다음
아까 프린트 해준 코드가 실행되었다.
ypcc 모듈이 설치되었다.

이쯤에서 드는 의문. 폴더이름을 ypcc2 라는 별개의 폴더에 __init__.py를 추가해주면 그것도 모듈이 될까?

ypcc2 폴더 및 __init__.py가 추가 된 모습
ypcc와 ypcc2 둘다 임포트 되는 모습
설치도 이렇게 모듈이 두 개나 있다.

결론

  • 일단 pip install ypcc 후에 python 에서 import ypcc 를 하기 위해서는 setup.py 파일이 있는 곳에 ypcc로 폴더를 만들어주고, __init__.py를 생성해준 뒤에 할 수 있따.
  • PyPI와 같은 이름일 필요도 없다. ypcc2로 폴더를 만들면 import ypcc2 도 된다.

--

--

Jay
Jay

Written by Jay

Brain Neural Network : Where neuroscience meets machine learning

No responses yet