Poetry, the Package Manager

52f8d51b29e1f0cba942f158f8212180?s=47 fx-kirin
January 07, 2020

Poetry, the Package Manager

52f8d51b29e1f0cba942f158f8212180?s=128

fx-kirin

January 07, 2020
Tweet

Transcript

  1. Osaka Python User Group #2 2020-01-17 1/28

  2. About me Name : Yoshiaki Ono Job : Self-employed Python

    Programmer Twitter : fx_kirin 2/28
  3. What is OPUG Share programming knowledge and help each other.

    3/28
  4. Poetry The Package Manager Yoshiaki Ono 4/28

  5. Agenda Poetry hands on Introduction of python package management Packaging

    history Manual way of packaging Poetry is great 5/28
  6. Before the talk Just give it a try. 6/28

  7. Install Poetry Linux / Mac Users Windows Users Anaconda(Not recommended)

    curl -sSL | python https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py (Invoke-WebRequest -Uri -UseBasicParsing).Content | python https://raw.githubusercontent.com/python-poetry/poetry/master/get- poetry.py conda install -c conda-forge poetry 7/28
  8. Create new package $ poetry new my-package Created package my_package

    in my-package my-package ├── my_package │ └── __init__.py ├── pyproject.toml ├── README.rst └── tests ├── __init__.py └── test_my_package.py 8/28
  9. Add dependencies $ cd my-package $ poetry add requests Using

    version ^2.22.0 for requests Updating dependencies Resolving dependencies... (2.8s) Writing lock file Package operations: 5 installs, 0 updates, 0 removals - Installing certifi (2019.11.28) - Installing chardet (3.0.4) - Installing idna (2.8) - Installing urllib3 (1.25.7) - Installing requests (2.22.0) 9/28
  10. Implement the module ./my_package/__init__.py 01 __version__ = "0.1.0" 02 03

    import requests 04 05 06 def foo(): 07 requests.get("https://www.google.com") 08 print("Log from my_package") 10/28
  11. Build the package $ poetry build Building my-package (0.1.0) -

    Building sdist - Built my-package-0.1.0.tar.gz - Building wheel - Built my_package-0.1.0-py3-none-any.whl 11/28
  12. Install to global python $ cd dist $ pip install

    my_package-0.1.0-py3-none-any.whl Requirement already satisfied: my-package==0.1.0 from file:///tmp/my-package/dist/my_pac Requirement already satisfied: logzero<2.0.0,>=1.5.0 in /home/zenbook/.pyenv/versions/mi Requirement already satisfied: requests<3.0.0,>=2.22.0 in /home/zenbook/.pyenv/versions/ Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /home/zenbook/.pyenv/versions/mi Requirement already satisfied: idna<2.9,>=2.5 in /home/zenbook/.pyenv/versions/miniconda Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/zenbook/ Requirement already satisfied: certifi>=2017.4.17 in /home/zenbook/.pyenv/versions/minic 12/28
  13. Test the package $ ipython Python 3.6.7 |Anaconda, Inc.| (default,

    Oct 23 2018, 19:16:44) Type 'copyright', 'credits' or 'license' for more information IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: import my_package In [2]: my_package.foo() Log from my_package 13/28
  14. Upload to PyPI $ poetry publish Publishing my-package (0.1.0) to

    PyPI Username: test Password: - Uploading my-package-0.1.0.tar.gz 100% ... 14/28
  15. Super Easy! 15/28

  16. Packaging 16/28

  17. What it looks like in Python Module: a file containing

    Python code Package: a directory of Python module Distribution: an archived module/package (tar, whl, zip) package_name ├── dist │ └── package_name-0.1.0.tar.gz ├── package_name │ └── __init__.py └── setup.py 17/28
  18. Python's packaging history 2000: Distutils 2003: PyPI 2004: Setuptools 2007:

    Virtualenv 2008: Pip 2011: Python Packaging Authority(PyPA) 2013: Wheel 2016: Pyproject.toml 2017: Pipenv 2018: Poetry 18/28
  19. Python Packaging was so complicated. 19/28

  20. PyPA packaging tutorial https://packaging.python.org/ 20/28

  21. 1. Manually create a project structure packaging_tutorial/ example_pkg/ __init__.py setup.py

    LICENSE README.md 21/28
  22. 2. Manually write setup.py import setuptools with open("README.md", "r") as

    fh: long_description = fh.read() setuptools.setup( name="example-pkg-your-username", version="0.0.1", author="Example Author", author_email="author@example.com", description="A small example package", long_description=long_description, ..., python_requires='>=3.6', ) 22/28
  23. 3. Build distribution with setuptools $ pip install setuptools wheel

    $ python3 setup.py sdist bdist_wheel $ ls dist dist/ example_pkg-0.0.1-py3-none-any.whl example_pkg-0.0.1.tar.gz 23/28
  24. 4. Use tool called twine to upload $ pip install

    twine $ python -m twine upload dist/* Uploading distributions... Enter your username: [your username] Enter your password: ... uploaded 24/28
  25. Poetry does all of them. 25/28

  26. setup.py generated by poetry 01 # -*- coding: utf-8 -*-

    02 from setuptools import setup 03 04 packages = \ 05 ['my_package'] 06 07 package_data = \ 08 {'': ['*']} 09 10 install_requires = \ 11 ['requests>=2.22.0,<3.0.0'] 12 13 setup_kwargs = { 14 'name': 'my-package', 15 'version': '0.1.0', 16 'description': '', 17 'long_description': None, 26/28
  27. What you can't do with Poetry C-Extension libraries. 27/28

  28. Let's start using Poetry and make your life easier! 28/28