Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2017 - The Packaging Gradient

Db2ee812bdc6fd057f8f4209c08b6f63?s=47 PyBay
August 21, 2017

2017 - The Packaging Gradient

Shipping any software can be hard if you don't know what you're getting into. An ergonomic, general-purpose language like Python can get you into complex packaging waters without you noticing. This talk presents a straightforward, example-driven guide to choosing among virtually every method in common use for packaging Python, scaling from wheels to PEX to Docker and more.
Deployment is not the last step of development. Experienced engineers know to work backwards from deployment requirements, planning and designing for the reality of production environments.

Python packaging sometimes gets a bad reputation, but a lot of this comes from less experienced engineers learning the hard way that implementation language does not dictate their packaging solutions.

Packaging is all about target environment and deployment experience. Python was designed to be cross-platform and runs in countless environments. Python's built-in tools can't carry you anywhere you want to go. These days, I can write a mobile app in Python, but obviously people don't use pip to install it. More advanced codebases have to scale their packaging accordingly.

This talk moves example by example, presenting shippable code, and the simplest packaging solution appropriate for it. All the examples are in Python, but the lessons are absolutely language agnostic. Learn the packaging gradient and put those deployment doubts to rest once and for all.

Mahmoud Hashemi is a backend engineer and architect, open-source library maintainer, and Wikipedian. Newly building services and teams at shopkick, for many years, he built scalable enterprise Python services at PayPal, where he wrote technical essays and presented O'Reilly's Enterprise Software with Python. On the Wikipedia side of things, he's known for Listen to Wikipedia, Wikipedia Social Search, the Weeklypedia newsletter, the Wikipedia IFTTT channel, and much much more. He believes education is more than something you receive, and that every coder should be able to see one, do one, then teach one.

Video: https://www.youtube.com/watch?v=iLVNWfPWAC8



August 21, 2017


  1. The Packaging Gradient Mahmoud Hashemi August, 2017 A Holistic Guide

    to Software Distribution
  2. Packaging ⊡ Turning your code into a self-contained artifact (file)

    ⊡ For reliable transfer to and use in production environments a. Data centers b. Laptops / Phones But how? The fine art of:
  3. “” “TBD” — IRL packaging instructions

  4. Packaging reality ⊡ Developers leave packaging until the end ⊡

    They discover what feels like a thousand options ⊡ They invent one more. a. Docs TBD
  5. “” “The first 90% of the code accounts for the

    first 90% of development time. The last 10% of the code accounts for the other 90% of development time.” — Tom Cargill, Bell Labs The Rule
  6. Packaging is not the last step. Production environment is everything.


  8. Deploying the “script” home:~$ scp useful.py dest: --- dest:~$ python

  9. python: command not found Oh, sorry, this bashrc is weird.

    Just a second... 1 ❌
  10. ImportError: No module named requests This was working on my

    machine a second ago... 1 ❌❌
  11. SSL certificate error: [Errno 1] _ssl.c:504: error:0D0890A1:asn1 encoding routines:ASN1_verify: unknown

    message digest algorithm I thought we were friends. ❌❌❌
  12. The “script” import requests resp = requests.get('https://github.com/mahmoud') print(resp.status) # (that’s

  13. Mahmoud Hashemi August, 2017 A Convenient Analogy to Software Packaging

    The Packing Gradient
  14. ? How far are you traveling? (approximately)

  15. A few blocks? A wallet or purse. A few miles?

    A backpack at least California? A carry-on bag The USA? A suitcase, or maybe an RV Otherwise? Any of the above — and a passport The Packing Gradient How far you travel influences what you pack low size high portability
  16. The Packing Gradient Distance and accommodations determine what you pack.

    (hotel) (no hotel)
  17. What does this look like for software? Back to our

    regularly scheduled program. ?
  18. The standalone Python module ⊡ A .py file is a

    module ⊡ Standalone: only imports from the standard library ⊡ schema, ashes, boltons, bottle.py ⊡ Easy to distribute and integrate
  19. The pure-Python package ⊡ A directory with a __init__.py in

    it is a package ⊡ Django, requests, hyperlink ⊡ Easy to install with pip • pip installs packages, after all, right?
  20. Pardon my dist ⊡ A distribution is an archive of

    zero or more packages ⊡ Built by setuptools through setup.py ⊡ Example: sdist • Simple, source-only .tar.gz • Great for pure-Python modules and packages ⊡ Motivational case study: PIL & Pillow
  21. The full Python package ⊡ Python s interoperability & performance

    ⊡ Pillow, numpy, SciPy, gevent ⊡ wheel • The shiny new binary distribution, or bdist • Supports most Windows, Mac, & Linux (We don’t talk about .eggs anymore.)
  22. Linkin’ Libs ⊡ Static linking vs dynamic linking ⊡ Some

    wheels are bigger than others ⊡ System libraries • .dll & .so • libcrypto (OpenSSL) • libxml2 / libpng / libpython
  23. In summary python setup.py sdist bdist_wheel upload The modern way

    to build and upload a Python package
  24. FIN Thanks for coming! github.com/mahmoud

  25. Questions? ⊡ I sure hope so! ⊡ Even wheel won’t

    let you install most types of software ⊡ Python’s native package management will get you: • Libraries • Basic dev tools • (that’s it)
  26. PyPI is not an app store Python is general-purpose, but

    pip and PyPI are not
  27. pip requirements ⊡ A working Python with pip installed ⊡

    A network connection, probably to the Internet ⊡ Preinstalled system libraries ⊡ Build tools for target packages (gcc/clang) • For when wheels aren’t available for your platform Standard pip installation requires:
  28. pip requirements You. A developer willing to sit and watch

    dependencies download, and debug any version conflicts, build errors, etc. But pip’s most important dependency:
  29. Packaging Python ⊡ Sublime Text ⊡ EVE Online ⊡ Reddit

    “Python Packaging” vs “Packaging Python” How do we ship applications?
  30. ⊡ Python EXecutable ⊡ Single, runnable file ⊡ No setup

    or install ⊡ Builds on Python’s zipimport □ superzippy □ zipapp ⊡ Same constraints as wheel Packaging Python Applications PEX PEX’s internal structure: hashbang python + zip
  31. Our app on PEX <3 MB OS-specific Similar to wheels

    System Python Linux / Mac No setup step Web download Wiki attachment Slack/Hipchat PEX is probably The Right Way™ to distribute useful.py. Installation requires Artifact details Distribution options
  32. Packaging Python Applications Anaconda’s internal layout (lib, include, bin, etc)

    ⊡ A whole new ecosystem ⊡ conda install applications □ postgres □ nginx □ python, itself ⊡ Built on OS and Python features □ Filesystem layout □ Python landmarking □ PatchELF Anaconda
  33. Anaconda. Is. Awesome. Cross-platform, Python-first package management and social app

  34. Our app on conda Artifact details <1 MB OS-specific .tar.bz2

    Installation requires Anaconda Linux / Mac / Windows conda install step Distribution options anaconda.org conda is a good channel for distributing our tool to devs and data people
  35. A bundle of py. ⊡ Bring your own Python! ⊡

    Generally entails an installer. □ Dropbox □ EVE Online □ Civilization IV □ All Kivy apps ⊡ Lots of options: □ cx_Freeze, PyInstaller, osnap, bbFreeze, py2exe, py2app, pynsist, nuitka, ... Freezers Packaging Python Applications
  36. Our app, frozen Artifact details <30MB OS-specific .exe / .app

    / etc. Installation requires Linux / Mac / Windows Executable or double-click install System libraries Distribution options Direct download App stores Freezers represent the best option for consumer software.
  37. So many wheels going round. ⊡ Servers need extra attention

    ⊡ Chef Omnibus ⊡ Higher-level self-containment ⊡ Copies of all dependent services ⊡ Case Study: GitLab □ https://about.gitlab.com/installation/ □ https://gitlab.com/gitlab-org/omnibus-gitlab Freezers (EE) Packaging Python Applications
  38. Our app on Omnibus Artifact details <100MB .rpm / .deb

    Installation requires Debian-/RedHat-based Linux yum or apt Minimal system libraries Distribution options Direct download PPA / package repo Omnibus could probably ship a script, but works best for applications with multiple components (services, queues, batches)
  39. Intermission: bits and pieces ⊡ virtualenv ⊡ RPM, DEB, etc.

    On their own, not so great for users ⊡ Example: dh-virtualenv □ Analogous to PEX: includes libraries, but not Python □ Artifacts managed by your Debian package manager Many technologies, many more part than whole.
  40. Like selfies, but twice as trendy. ⊡ Bring your own

    userspace! ⊡ Anaconda meets old autostart CDs ⊡ Example: AppImage ⊡ Case study: kdenlive Userspace Images Packaging Python Applications
  41. Our app in an image Artifact details <100MB ISO 9660

    Installation requires Linux chmod +x Distribution options Direct download Shared folder For Linux, an image is even better than a PEX, if a bit conservative.
  42. Basically disposable, but they never seem to seal as well

    as they promise. ⊡ Userspace images □ + sandboxing □ + distribution ⊡ Flatpak / Snappy □ .deb vs .rpm round 2 ⊡ Docker (Moby?) “Containers” Packaging Python Applications
  43. Our app, containerized Artifact details 100MB-2GB Often hidden Installation requires

    Linux (or equiv. virtualization) Container runtime “Pull” step Distribution options Linux app store Docker Hub/Registry Containers might be overkill for our script, but it wouldn’t top the charts for the most ridiculous image to date.
  44. ⊡ Bring the whole dang kernel ⊡ Production-grade emulation ⊡

    Key to the cloud Virtual Machines Screenshot of OpenStack deployment in progress. Packaging Python Applications
  45. Our app, virtualized Artifact details 100MB-8GB Many formats Installation requires

    Any OS Hypervisor Distribution options Direct download AWS OpenStack Glance While too unwieldy for our script, VMs are only getting more powerful.
  46. ⊡ Just ship the box. ⊡ Appliances! Hardware High-latency delivery,

    but comes fully loaded. Packaging Python Applications
  47. Our app on hardware Artifact details 4" x 3" x

    1" $50 Ships in 1-3 business weeks Installation requires Electricity Distribution options USPS DHL A good toss Coming soon to a Kickstarter near you.
  48. Wrapping up We learned: ⊡ Packaging is the fine art

    of creating a distributable software artifact ⊡ A packaging design is not the last phase in a project ⊡ Python is general purpose, PyPI and pip are not ⊡ Because libraries are different than applications
  49. Wrapping up 1 2 3 Packaging for Python libraries 1.

    .py - standalone modules 2. sdist - Pure-Python packages 3. wheel - Python packages (With room to spare for static vs. dynamic linking)
  50. Wrapping up 1 1. PEX - libraries included 2. anaconda

    - Python ecosystem 3. freezers - Python included 4. images - system libraries included 5. containers - sandboxed images 6. virtual machines - kernel included 7. hardware - plug and play 2 3 4 5 6 7 Packaging for Python applications
  51. THANKS! Questions? bit.ly/pkgrad @mhashemi