SlideShare ist ein Scribd-Unternehmen logo
1 von 65
Downloaden Sie, um offline zu lesen
PACKAGING INPACKAGING IN
PYTHON?PYTHON?
DON'T ROLL THE DICE.DON'T ROLL THE DICE.
EFFECTIVE PACKAGEEFFECTIVE PACKAGE
MANAGEMENT IS HARD.MANAGEMENT IS HARD.
WHAT SHOULD WE EXPECTWHAT SHOULD WE EXPECT
FROM PACKAGE MANAGERS?FROM PACKAGE MANAGERS?
RECONCILES THE BEST VERSION OF EACHRECONCILES THE BEST VERSION OF EACH
PACKAGE FOR ALL REQUIREMENTS.PACKAGE FOR ALL REQUIREMENTS.
setuptools >= 36.2.1
+ setuptools == *
+ setuptools <= 37.0.0
= setuptools 36.7.2
WORKS TO OPERATING SYSTEMWORKS TO OPERATING SYSTEM
CONSTRAINTS.CONSTRAINTS.
(Like Window's default 260 character path limit)
ENSURES A PERFECTLY REPLICABLEENSURES A PERFECTLY REPLICABLE
DEPENDENCY TREE.DEPENDENCY TREE.
(Not just the packages you rely on — also the
packages those packages rely upon, ad nauseum!)
SECURE.SECURE.
... NOT OBVIOUSLY INSECURE?... NOT OBVIOUSLY INSECURE?
Use different techniques to make sure the package
you downloaded is the one you expected.
Doesn't help if you expected a malicious package.
Some package managers will automatically
execute any scripts attached to a package as
pre/post-install.
The rest just show warnings that a user clicks
through.
OPTIMAL DOWNLOAD EXPERIENCE.OPTIMAL DOWNLOAD EXPERIENCE.
Use a combination of techniques to make package
downloads fast and reliable.
EMOJI.EMOJI.
Because yarn said so.
SO... PYTHON.SO... PYTHON.
SO... PYTHON.SO... PYTHON.
Python's current recommended package manager,
pip ,
Python's current recommended package manager,
pip ,
(which isn't generally installed by default if you're
using a Linux distribution's package manager),
Python's current recommended package manager,
pip ,
(which isn't generally installed by default if you're
using a Linux distribution's package manager),
(and also isn't installed by default on macOS),
Python's current recommended package manager,
pip ,
(which isn't generally installed by default if you're
using a Linux distribution's package manager),
(and also isn't installed by default on macOS),
is available by default on Windows when you
install Python!
RIGHT. EASY.RIGHT. EASY.
(USE PYENV EVERYWHERE, AND YOU'LL(USE PYENV EVERYWHERE, AND YOU'LL
HAVE PIP, AT LEAST)HAVE PIP, AT LEAST)
LINUX DISTRIBUTIONS PATCHLINUX DISTRIBUTIONS PATCH
PIP IN THEIR REPOSITORIES.PIP IN THEIR REPOSITORIES.
The default behaviour of trying to install packages
to system-level directories is not helpful for the
average Python developer.
sudo pip install is evil!
WORKS TO OPERATING SYSTEMWORKS TO OPERATING SYSTEM
CONSTRAINTS.CONSTRAINTS.
(Though, the Linux distributions generally do the
same thing in their own repositories in a slightly
different way — the behaviour can be desirable!)
WHAT IF YOU NEED TO INSTALL TWOWHAT IF YOU NEED TO INSTALL TWO
VERSIONS OF DJANGO AT THE SAME TIME?VERSIONS OF DJANGO AT THE SAME TIME?
THAT'S NOT DJANGO 1.11.15!THAT'S NOT DJANGO 1.11.15!
$ pip3 install --user django==2.1
...
Installing collected packages: django
Successfully installed django-2.1
$ pip3 install --user django==1.11.15
...
Installing collected packages: django
Successfully installed django-2.1
ENSURES A PERFECTLY REPLICABLEENSURES A PERFECTLY REPLICABLE
DEPENDENCY TREE.DEPENDENCY TREE.
EMOJI ASIDE,EMOJI ASIDE,
THAT'S TWO MAJOR ISSUESTHAT'S TWO MAJOR ISSUES
WITH DEFAULT PIP USAGE.WITH DEFAULT PIP USAGE.
VIRTUALENVVIRTUALENV
virtualenv is a tool to create isolated
Python environments.
spammish-repetition
django == 1.11.15
spambot > 2.0
postgres == *
pip
project-antigravity
six == *
reverse > 2.0
requests < 42.1.3
pin == 1.2.3.4
pip
python
THE MAGICAL VIRTUALENVTHE MAGICAL VIRTUALENV
ACTIVATE SCRIPTACTIVATE SCRIPT
activate sandboxes the session into using a
specific (redirected) Python interpreter, and keeps
packages inside the sandbox. It can optionally let
you access packages installed elsewhere in the
system, or restrict access entirely.
A VIRTUALENV PER PROJECTA VIRTUALENV PER PROJECT
If you use a virtualenv per project, each project
can have completely independent dependencies,
without any accidental upgrades or operations
that affect another project.
PIP FREEZEPIP FREEZE
Using the pip freeze command, you can get a
list of all packages installed by pip .
Inside a virtualenv , that's limited to packages
you installed there.
autopep8==1.3.5
colorama==0.3.9
mock==2.0.0
nose==1.3.7
pycodestyle==2.4.0
pylint==1.9.2
rope==0.10.7
six==1.11.0
virtualenv==16.0.0
virtualenv-clone==0.3.0
ENSURES A PERFECTLY REPLICABLEENSURES A PERFECTLY REPLICABLE
DEPENDENCY TREE?DEPENDENCY TREE?
NOT QUITE.NOT QUITE.
TRANSITIVE DEPENDENCIES AREN'TTRANSITIVE DEPENDENCIES AREN'T
LOCKED.LOCKED.
A package you rely upon might have a package it
relies upon update, breaking compatibility.
Then your production deploy won't run, even
though the "same dependencies" work on your
machine.
And as a side note, if you're forgetful like me,
sometime you forget to activate your
virtualenv .
Repeatedly.
PIPENVPIPENV
Python Development Workflow for
Humans
AUTOMATED VIRTUALENVS.AUTOMATED VIRTUALENVS.
TRANSITIVE DEPENDENCYTRANSITIVE DEPENDENCY
LOCKING.LOCKING.
ONE COMMAND TO USE ANDONE COMMAND TO USE AND
REMEMBER.REMEMBER.
DEPENDENCIES FROM GITHUBDEPENDENCIES FROM GITHUB
ETC.ETC.
SERIOUSLY, IT DOES MORE COOL THINGSSERIOUSLY, IT DOES MORE COOL THINGS
THAN I REALISED!THAN I REALISED!
$ pipenv --three
Virtualenv location: /home/liamdawson/.virtualenvs/wat-txLatJkZ
$ pipenv install django
Adding django to Pipfile's [packages]...
Pipfile.lock not found, creating...
Installing dependencies from Pipfile.lock (4f9dd2)...
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv ru
$ pipenv run python -m 'django-admin' startproject helloworld
$ ls
helloworld/ Pipfile Pipfile.lock
NO NEED TO MAKE ORNO NEED TO MAKE OR
ACTIVATE VIRTUALENVS.ACTIVATE VIRTUALENVS.
They're still there and in use, though — pipenv -
-venv .
CHECK IN THE PIPFILE.LOCKCHECK IN THE PIPFILE.LOCK
(Unless you're building a reusable library)
Now you have a locked dependency graph for fully
replicable builds!
HOW HARD IS IT TO MIGRATEHOW HARD IS IT TO MIGRATE
TO PIPENV?TO PIPENV?
$ git clone https://github.com/shalakhin/check_btc_tx.git
$ cd check_btc_tx
$ pipenv --three
requirements.txt found, instead of Pipfile! Converting...
$ pipenv install
# Check the last donation to The Internet Archive
$ pipenv run python check 1Archive1n2C579dMsAu3iC6tWzuQJz8dN
TXID: a75fe75...
Status: Confirmed
Amount: 0.15997978
TESTS?TESTS?
Handled natively as a "dev-only" dependency.
$ pipenv install --dev --requirements requirements-dev.txt
$ pipenv install --dev nose
$ head --lines=-3 Pipfile | tail --lines=+5
[dev-packages]
nose = "*"
[packages]
click = "*"
requests = "*"
$ pipenv install # --dev
REVERSIBLE?REVERSIBLE?
pipenv lock -r > requirements.txt
EMOJI?EMOJI?
Just not on Windows, where I ran my code.
(Time to write a PR!)
WHEN A NEW DEVELOPERWHEN A NEW DEVELOPER
STARTS ON YOUR PROJECT...STARTS ON YOUR PROJECT...
PIPENV INSTALLPIPENV INSTALL
If they're using pyenv , it installs the right
Python version for them.
Sets up a virtualenv for the project.
Installs the requirements (and dev requirements
if you pass --dev ).
Can run scripts you set up, such as pipenv run
format .
Can still replicate activate behaviour from the
virtualenv via pipenv shell
PREVIOUS EXAMPLE BECOMESPREVIOUS EXAMPLE BECOMES
1. git clone
2. pipenv install --dev
3. pipenv run check
4.
WHERE DOES PIPENV FALLWHERE DOES PIPENV FALL
SHORT?SHORT?
PIPENV IS A TOP-NOTCH TOOL FORPIPENV IS A TOP-NOTCH TOOL FOR
MANAGING AN APPLICATION WHICH:MANAGING AN APPLICATION WHICH:
Runs on one version of Python.
Isn't used as a dependency.
Isn't packaged for PyPi etc.
PIPFILES DECLARE AN EXPECTED VERSIONPIPFILES DECLARE AN EXPECTED VERSION
OF PYTHONOF PYTHON
PIPFILE.LOCK RIGIDLY FIXES DEPENDENCYPIPFILE.LOCK RIGIDLY FIXES DEPENDENCY
VERSIONSVERSIONS
(which doesn't suit usage as a dependency)
PIPENV WON'T HELP WITH PACKAGEPIPENV WON'T HELP WITH PACKAGE
CONFIGURATIONCONFIGURATION
IF THOSE ASSUMPTIONS DON'TIF THOSE ASSUMPTIONS DON'T
SUIT YOU?SUIT YOU?
TRY POETRYTRY POETRY
(the tool)
POETRY IS A SOMEWHAT FULLER-POETRY IS A SOMEWHAT FULLER-
FEATURED TOOL FOR DEPENDENCYFEATURED TOOL FOR DEPENDENCY
MANAGEMENT.MANAGEMENT.
Poetry is a little more involved, and uses more
metadata.
This equips it to support packaging and
publishing, in addition to dependency
management.
IF YOU USE PYENV TO MANAGE YOURIF YOU USE PYENV TO MANAGE YOUR
PYTHON VERSIONSPYTHON VERSIONS
AND PIPENV OR POETRY TO MANAGEAND PIPENV OR POETRY TO MANAGE
YOUR PROJECTSYOUR PROJECTS
IT'S A LOT LESS BITE FOR EVERYONE.IT'S A LOT LESS BITE FOR EVERYONE.
Party danger noodle!
FIN.FIN.
  
Want to follow up later? I'm on Twitter:
@LIAMDAWS@LIAMDAWS
CREDITSCREDITS
Elephant photo by on
Unsplash
Original snake photo by on
Unsplash
Inbetween Architects
Boris Smokrovic

Weitere ähnliche Inhalte

Was ist angesagt?

TYPO3 CMS deployment with Jenkins CI
TYPO3 CMS deployment with Jenkins CITYPO3 CMS deployment with Jenkins CI
TYPO3 CMS deployment with Jenkins CIderdanne
 
Free tools for rapidly deploying software
Free tools for rapidly deploying softwareFree tools for rapidly deploying software
Free tools for rapidly deploying softwareConcentrated Technology
 
Automated Deployment using Open Source
Automated Deployment using Open SourceAutomated Deployment using Open Source
Automated Deployment using Open Sourceduskglow
 
Docker and Puppet — Puppet Camp L.A. — SCALE12X
Docker and Puppet — Puppet Camp L.A. — SCALE12XDocker and Puppet — Puppet Camp L.A. — SCALE12X
Docker and Puppet — Puppet Camp L.A. — SCALE12XJérôme Petazzoni
 
Chef Conf 2015: Package Management & Chef
Chef Conf 2015: Package Management & ChefChef Conf 2015: Package Management & Chef
Chef Conf 2015: Package Management & Chefice799
 
Multi-provider Vagrant and Chef: AWS, VMware, and more
Multi-provider Vagrant and Chef: AWS, VMware, and moreMulti-provider Vagrant and Chef: AWS, VMware, and more
Multi-provider Vagrant and Chef: AWS, VMware, and moreChef Software, Inc.
 
Puppet Camp LA 2/19/2015
Puppet Camp LA 2/19/2015Puppet Camp LA 2/19/2015
Puppet Camp LA 2/19/2015ice799
 
Scalable Deployment Architectures with TYPO3 Surf, Git and Jenkins
Scalable Deployment Architectures with TYPO3 Surf, Git and JenkinsScalable Deployment Architectures with TYPO3 Surf, Git and Jenkins
Scalable Deployment Architectures with TYPO3 Surf, Git and Jenkinsmhelmich
 
How Puppet Enables the Use of Lightweight Virtualized Containers - PuppetConf...
How Puppet Enables the Use of Lightweight Virtualized Containers - PuppetConf...How Puppet Enables the Use of Lightweight Virtualized Containers - PuppetConf...
How Puppet Enables the Use of Lightweight Virtualized Containers - PuppetConf...Puppet
 
Slides Aquarium Paris 2008
Slides Aquarium Paris 2008Slides Aquarium Paris 2008
Slides Aquarium Paris 2008julien.ponge
 
The End of the world as we know it - AKA your last NullPointerException $1B b...
The End of the world as we know it - AKA your last NullPointerException $1B b...The End of the world as we know it - AKA your last NullPointerException $1B b...
The End of the world as we know it - AKA your last NullPointerException $1B b...Michael Vorburger
 
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...Carlos Sanchez
 
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)Chu-Siang Lai
 
Oscar: Rapid Iteration with Vagrant and Puppet Enterprise - PuppetConf 2013
Oscar: Rapid Iteration with Vagrant and Puppet Enterprise - PuppetConf 2013Oscar: Rapid Iteration with Vagrant and Puppet Enterprise - PuppetConf 2013
Oscar: Rapid Iteration with Vagrant and Puppet Enterprise - PuppetConf 2013Puppet
 
PuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With NotesPuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With NotesPhil Zimmerman
 
Continuous Delivery of Puppet Manifests
Continuous Delivery of Puppet ManifestsContinuous Delivery of Puppet Manifests
Continuous Delivery of Puppet ManifestsKris Buytaert
 
Puppet Camp Berlin 2015: Felix Frank | Rapid Testing Setups for Puppet
Puppet Camp Berlin 2015: Felix Frank | Rapid Testing Setups for PuppetPuppet Camp Berlin 2015: Felix Frank | Rapid Testing Setups for Puppet
Puppet Camp Berlin 2015: Felix Frank | Rapid Testing Setups for PuppetNETWAYS
 
Vagrant - the essence of DevOps in a tool
Vagrant - the essence of DevOps in a toolVagrant - the essence of DevOps in a tool
Vagrant - the essence of DevOps in a toolPaul Stack
 

Was ist angesagt? (20)

TYPO3 CMS deployment with Jenkins CI
TYPO3 CMS deployment with Jenkins CITYPO3 CMS deployment with Jenkins CI
TYPO3 CMS deployment with Jenkins CI
 
Free tools for rapidly deploying software
Free tools for rapidly deploying softwareFree tools for rapidly deploying software
Free tools for rapidly deploying software
 
Automated Deployment using Open Source
Automated Deployment using Open SourceAutomated Deployment using Open Source
Automated Deployment using Open Source
 
Docker and Puppet — Puppet Camp L.A. — SCALE12X
Docker and Puppet — Puppet Camp L.A. — SCALE12XDocker and Puppet — Puppet Camp L.A. — SCALE12X
Docker and Puppet — Puppet Camp L.A. — SCALE12X
 
Chef Conf 2015: Package Management & Chef
Chef Conf 2015: Package Management & ChefChef Conf 2015: Package Management & Chef
Chef Conf 2015: Package Management & Chef
 
Power Of Zero
Power Of ZeroPower Of Zero
Power Of Zero
 
Multi-provider Vagrant and Chef: AWS, VMware, and more
Multi-provider Vagrant and Chef: AWS, VMware, and moreMulti-provider Vagrant and Chef: AWS, VMware, and more
Multi-provider Vagrant and Chef: AWS, VMware, and more
 
Puppet Camp LA 2/19/2015
Puppet Camp LA 2/19/2015Puppet Camp LA 2/19/2015
Puppet Camp LA 2/19/2015
 
Scalable Deployment Architectures with TYPO3 Surf, Git and Jenkins
Scalable Deployment Architectures with TYPO3 Surf, Git and JenkinsScalable Deployment Architectures with TYPO3 Surf, Git and Jenkins
Scalable Deployment Architectures with TYPO3 Surf, Git and Jenkins
 
Security Testing Using Infrastructure-As-Code
Security Testing Using Infrastructure-As-CodeSecurity Testing Using Infrastructure-As-Code
Security Testing Using Infrastructure-As-Code
 
How Puppet Enables the Use of Lightweight Virtualized Containers - PuppetConf...
How Puppet Enables the Use of Lightweight Virtualized Containers - PuppetConf...How Puppet Enables the Use of Lightweight Virtualized Containers - PuppetConf...
How Puppet Enables the Use of Lightweight Virtualized Containers - PuppetConf...
 
Slides Aquarium Paris 2008
Slides Aquarium Paris 2008Slides Aquarium Paris 2008
Slides Aquarium Paris 2008
 
The End of the world as we know it - AKA your last NullPointerException $1B b...
The End of the world as we know it - AKA your last NullPointerException $1B b...The End of the world as we know it - AKA your last NullPointerException $1B b...
The End of the world as we know it - AKA your last NullPointerException $1B b...
 
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...
Infrastructure testing with Jenkins, Puppet and Vagrant - Agile Testing Days ...
 
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd+)
 
Oscar: Rapid Iteration with Vagrant and Puppet Enterprise - PuppetConf 2013
Oscar: Rapid Iteration with Vagrant and Puppet Enterprise - PuppetConf 2013Oscar: Rapid Iteration with Vagrant and Puppet Enterprise - PuppetConf 2013
Oscar: Rapid Iteration with Vagrant and Puppet Enterprise - PuppetConf 2013
 
PuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With NotesPuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With Notes
 
Continuous Delivery of Puppet Manifests
Continuous Delivery of Puppet ManifestsContinuous Delivery of Puppet Manifests
Continuous Delivery of Puppet Manifests
 
Puppet Camp Berlin 2015: Felix Frank | Rapid Testing Setups for Puppet
Puppet Camp Berlin 2015: Felix Frank | Rapid Testing Setups for PuppetPuppet Camp Berlin 2015: Felix Frank | Rapid Testing Setups for Puppet
Puppet Camp Berlin 2015: Felix Frank | Rapid Testing Setups for Puppet
 
Vagrant - the essence of DevOps in a tool
Vagrant - the essence of DevOps in a toolVagrant - the essence of DevOps in a tool
Vagrant - the essence of DevOps in a tool
 

Ähnlich wie Packaging in Python? Don't Roll the Dice.

Arbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvArbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvMarkus Zapke-Gründemann
 
AWS EC2 Ubuntu Instance - Step-by-Step Deployment Guide
AWS EC2 Ubuntu Instance - Step-by-Step Deployment GuideAWS EC2 Ubuntu Instance - Step-by-Step Deployment Guide
AWS EC2 Ubuntu Instance - Step-by-Step Deployment GuideRapidValue
 
Django district pip, virtualenv, virtualenv wrapper & more
Django district  pip, virtualenv, virtualenv wrapper & moreDjango district  pip, virtualenv, virtualenv wrapper & more
Django district pip, virtualenv, virtualenv wrapper & moreJacqueline Kazil
 
Puppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 EditionPuppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 EditionJoshua Thijssen
 
Arbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvArbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvMarkus Zapke-Gründemann
 
Closing the gap between Distros(devs) and their Users(ops)
Closing the gap between Distros(devs) and their Users(ops)Closing the gap between Distros(devs) and their Users(ops)
Closing the gap between Distros(devs) and their Users(ops)Kris Buytaert
 
Dev Environments: The Next Generation
Dev Environments: The Next GenerationDev Environments: The Next Generation
Dev Environments: The Next GenerationTravis Thieman
 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in DjangoKevin Harvey
 
Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)Ivan Rossi
 
Virtualize and automate your development environment for fun and profit
Virtualize and automate your development environment for fun and profitVirtualize and automate your development environment for fun and profit
Virtualize and automate your development environment for fun and profitAndreas Heim
 
Python Versions and Dependencies Made Easy
Python Versions and Dependencies Made EasyPython Versions and Dependencies Made Easy
Python Versions and Dependencies Made EasySebastian Witowski
 
Nrpe - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core
Nrpe - Nagios Remote Plugin Executor. NRPE plugin for Nagios CoreNrpe - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core
Nrpe - Nagios Remote Plugin Executor. NRPE plugin for Nagios CoreNagios
 
NRPE - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core 4 and others.
NRPE - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core 4 and others.NRPE - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core 4 and others.
NRPE - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core 4 and others.Marc Trimble
 
Python virtualenv & pip in 90 minutes
Python virtualenv & pip in 90 minutesPython virtualenv & pip in 90 minutes
Python virtualenv & pip in 90 minutesLarry Cai
 
Testing your puppet code
Testing your puppet codeTesting your puppet code
Testing your puppet codeJulien Pivotto
 
Python packaging and dependency resolution
Python packaging and dependency resolutionPython packaging and dependency resolution
Python packaging and dependency resolutionTatiana Al-Chueyr
 
Organize your chickens: NuGet for the enterprise
Organize your chickens: NuGet for the enterpriseOrganize your chickens: NuGet for the enterprise
Organize your chickens: NuGet for the enterpriseMaarten Balliauw
 

Ähnlich wie Packaging in Python? Don't Roll the Dice. (20)

Pwnstaller
PwnstallerPwnstaller
Pwnstaller
 
Arbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvArbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenv
 
AWS EC2 Ubuntu Instance - Step-by-Step Deployment Guide
AWS EC2 Ubuntu Instance - Step-by-Step Deployment GuideAWS EC2 Ubuntu Instance - Step-by-Step Deployment Guide
AWS EC2 Ubuntu Instance - Step-by-Step Deployment Guide
 
Python environments
Python environmentsPython environments
Python environments
 
Django district pip, virtualenv, virtualenv wrapper & more
Django district  pip, virtualenv, virtualenv wrapper & moreDjango district  pip, virtualenv, virtualenv wrapper & more
Django district pip, virtualenv, virtualenv wrapper & more
 
Puppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 EditionPuppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 Edition
 
Arbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenvArbeiten mit distribute, pip und virtualenv
Arbeiten mit distribute, pip und virtualenv
 
Closing the gap between Distros(devs) and their Users(ops)
Closing the gap between Distros(devs) and their Users(ops)Closing the gap between Distros(devs) and their Users(ops)
Closing the gap between Distros(devs) and their Users(ops)
 
Dev Environments: The Next Generation
Dev Environments: The Next GenerationDev Environments: The Next Generation
Dev Environments: The Next Generation
 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in Django
 
Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)
 
Virtualize and automate your development environment for fun and profit
Virtualize and automate your development environment for fun and profitVirtualize and automate your development environment for fun and profit
Virtualize and automate your development environment for fun and profit
 
Python Versions and Dependencies Made Easy
Python Versions and Dependencies Made EasyPython Versions and Dependencies Made Easy
Python Versions and Dependencies Made Easy
 
Nrpe - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core
Nrpe - Nagios Remote Plugin Executor. NRPE plugin for Nagios CoreNrpe - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core
Nrpe - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core
 
NRPE - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core 4 and others.
NRPE - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core 4 and others.NRPE - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core 4 and others.
NRPE - Nagios Remote Plugin Executor. NRPE plugin for Nagios Core 4 and others.
 
Python virtualenv & pip in 90 minutes
Python virtualenv & pip in 90 minutesPython virtualenv & pip in 90 minutes
Python virtualenv & pip in 90 minutes
 
Testing your puppet code
Testing your puppet codeTesting your puppet code
Testing your puppet code
 
Python packaging and dependency resolution
Python packaging and dependency resolutionPython packaging and dependency resolution
Python packaging and dependency resolution
 
Installing maven on windows
Installing maven on windowsInstalling maven on windows
Installing maven on windows
 
Organize your chickens: NuGet for the enterprise
Organize your chickens: NuGet for the enterpriseOrganize your chickens: NuGet for the enterprise
Organize your chickens: NuGet for the enterprise
 

Kürzlich hochgeladen

Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsBert Jan Schrijver
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024Mind IT Systems
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is insideshinachiaurasa2
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Hararemasabamasaba
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdfPearlKirahMaeRagusta1
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyviewmasabamasaba
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech studentsHimanshiGarg82
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfkalichargn70th171
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
SHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationSHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationShrmpro
 

Kürzlich hochgeladen (20)

Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
SHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationSHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions Presentation
 

Packaging in Python? Don't Roll the Dice.

  • 1. PACKAGING INPACKAGING IN PYTHON?PYTHON? DON'T ROLL THE DICE.DON'T ROLL THE DICE.
  • 2. EFFECTIVE PACKAGEEFFECTIVE PACKAGE MANAGEMENT IS HARD.MANAGEMENT IS HARD.
  • 3. WHAT SHOULD WE EXPECTWHAT SHOULD WE EXPECT FROM PACKAGE MANAGERS?FROM PACKAGE MANAGERS?
  • 4. RECONCILES THE BEST VERSION OF EACHRECONCILES THE BEST VERSION OF EACH PACKAGE FOR ALL REQUIREMENTS.PACKAGE FOR ALL REQUIREMENTS. setuptools >= 36.2.1 + setuptools == * + setuptools <= 37.0.0 = setuptools 36.7.2
  • 5. WORKS TO OPERATING SYSTEMWORKS TO OPERATING SYSTEM CONSTRAINTS.CONSTRAINTS. (Like Window's default 260 character path limit)
  • 6. ENSURES A PERFECTLY REPLICABLEENSURES A PERFECTLY REPLICABLE DEPENDENCY TREE.DEPENDENCY TREE. (Not just the packages you rely on — also the packages those packages rely upon, ad nauseum!)
  • 7. SECURE.SECURE. ... NOT OBVIOUSLY INSECURE?... NOT OBVIOUSLY INSECURE? Use different techniques to make sure the package you downloaded is the one you expected. Doesn't help if you expected a malicious package.
  • 8. Some package managers will automatically execute any scripts attached to a package as pre/post-install. The rest just show warnings that a user clicks through.
  • 9. OPTIMAL DOWNLOAD EXPERIENCE.OPTIMAL DOWNLOAD EXPERIENCE. Use a combination of techniques to make package downloads fast and reliable.
  • 13. Python's current recommended package manager, pip ,
  • 14. Python's current recommended package manager, pip , (which isn't generally installed by default if you're using a Linux distribution's package manager),
  • 15. Python's current recommended package manager, pip , (which isn't generally installed by default if you're using a Linux distribution's package manager), (and also isn't installed by default on macOS),
  • 16. Python's current recommended package manager, pip , (which isn't generally installed by default if you're using a Linux distribution's package manager), (and also isn't installed by default on macOS), is available by default on Windows when you install Python!
  • 17. RIGHT. EASY.RIGHT. EASY. (USE PYENV EVERYWHERE, AND YOU'LL(USE PYENV EVERYWHERE, AND YOU'LL HAVE PIP, AT LEAST)HAVE PIP, AT LEAST)
  • 18. LINUX DISTRIBUTIONS PATCHLINUX DISTRIBUTIONS PATCH PIP IN THEIR REPOSITORIES.PIP IN THEIR REPOSITORIES. The default behaviour of trying to install packages to system-level directories is not helpful for the average Python developer. sudo pip install is evil!
  • 19. WORKS TO OPERATING SYSTEMWORKS TO OPERATING SYSTEM CONSTRAINTS.CONSTRAINTS. (Though, the Linux distributions generally do the same thing in their own repositories in a slightly different way — the behaviour can be desirable!)
  • 20. WHAT IF YOU NEED TO INSTALL TWOWHAT IF YOU NEED TO INSTALL TWO VERSIONS OF DJANGO AT THE SAME TIME?VERSIONS OF DJANGO AT THE SAME TIME? THAT'S NOT DJANGO 1.11.15!THAT'S NOT DJANGO 1.11.15! $ pip3 install --user django==2.1 ... Installing collected packages: django Successfully installed django-2.1 $ pip3 install --user django==1.11.15 ... Installing collected packages: django Successfully installed django-2.1
  • 21. ENSURES A PERFECTLY REPLICABLEENSURES A PERFECTLY REPLICABLE DEPENDENCY TREE.DEPENDENCY TREE.
  • 22. EMOJI ASIDE,EMOJI ASIDE, THAT'S TWO MAJOR ISSUESTHAT'S TWO MAJOR ISSUES WITH DEFAULT PIP USAGE.WITH DEFAULT PIP USAGE.
  • 24. virtualenv is a tool to create isolated Python environments.
  • 25. spammish-repetition django == 1.11.15 spambot > 2.0 postgres == * pip project-antigravity six == * reverse > 2.0 requests < 42.1.3 pin == 1.2.3.4 pip python
  • 26. THE MAGICAL VIRTUALENVTHE MAGICAL VIRTUALENV ACTIVATE SCRIPTACTIVATE SCRIPT activate sandboxes the session into using a specific (redirected) Python interpreter, and keeps packages inside the sandbox. It can optionally let you access packages installed elsewhere in the system, or restrict access entirely.
  • 27. A VIRTUALENV PER PROJECTA VIRTUALENV PER PROJECT If you use a virtualenv per project, each project can have completely independent dependencies, without any accidental upgrades or operations that affect another project.
  • 28. PIP FREEZEPIP FREEZE Using the pip freeze command, you can get a list of all packages installed by pip . Inside a virtualenv , that's limited to packages you installed there.
  • 30. ENSURES A PERFECTLY REPLICABLEENSURES A PERFECTLY REPLICABLE DEPENDENCY TREE?DEPENDENCY TREE? NOT QUITE.NOT QUITE.
  • 31. TRANSITIVE DEPENDENCIES AREN'TTRANSITIVE DEPENDENCIES AREN'T LOCKED.LOCKED. A package you rely upon might have a package it relies upon update, breaking compatibility. Then your production deploy won't run, even though the "same dependencies" work on your machine.
  • 32. And as a side note, if you're forgetful like me, sometime you forget to activate your virtualenv . Repeatedly.
  • 37. ONE COMMAND TO USE ANDONE COMMAND TO USE AND REMEMBER.REMEMBER.
  • 38. DEPENDENCIES FROM GITHUBDEPENDENCIES FROM GITHUB ETC.ETC.
  • 39. SERIOUSLY, IT DOES MORE COOL THINGSSERIOUSLY, IT DOES MORE COOL THINGS THAN I REALISED!THAN I REALISED!
  • 40. $ pipenv --three Virtualenv location: /home/liamdawson/.virtualenvs/wat-txLatJkZ $ pipenv install django Adding django to Pipfile's [packages]... Pipfile.lock not found, creating... Installing dependencies from Pipfile.lock (4f9dd2)... To activate this project's virtualenv, run pipenv shell. Alternatively, run a command inside the virtualenv with pipenv ru $ pipenv run python -m 'django-admin' startproject helloworld $ ls helloworld/ Pipfile Pipfile.lock
  • 41. NO NEED TO MAKE ORNO NEED TO MAKE OR ACTIVATE VIRTUALENVS.ACTIVATE VIRTUALENVS. They're still there and in use, though — pipenv - -venv .
  • 42. CHECK IN THE PIPFILE.LOCKCHECK IN THE PIPFILE.LOCK (Unless you're building a reusable library) Now you have a locked dependency graph for fully replicable builds!
  • 43. HOW HARD IS IT TO MIGRATEHOW HARD IS IT TO MIGRATE TO PIPENV?TO PIPENV?
  • 44. $ git clone https://github.com/shalakhin/check_btc_tx.git $ cd check_btc_tx $ pipenv --three requirements.txt found, instead of Pipfile! Converting... $ pipenv install # Check the last donation to The Internet Archive $ pipenv run python check 1Archive1n2C579dMsAu3iC6tWzuQJz8dN TXID: a75fe75... Status: Confirmed Amount: 0.15997978
  • 45. TESTS?TESTS? Handled natively as a "dev-only" dependency. $ pipenv install --dev --requirements requirements-dev.txt $ pipenv install --dev nose $ head --lines=-3 Pipfile | tail --lines=+5 [dev-packages] nose = "*" [packages] click = "*" requests = "*" $ pipenv install # --dev
  • 47. EMOJI?EMOJI? Just not on Windows, where I ran my code. (Time to write a PR!)
  • 48. WHEN A NEW DEVELOPERWHEN A NEW DEVELOPER STARTS ON YOUR PROJECT...STARTS ON YOUR PROJECT...
  • 50. If they're using pyenv , it installs the right Python version for them. Sets up a virtualenv for the project. Installs the requirements (and dev requirements if you pass --dev ).
  • 51. Can run scripts you set up, such as pipenv run format . Can still replicate activate behaviour from the virtualenv via pipenv shell
  • 52. PREVIOUS EXAMPLE BECOMESPREVIOUS EXAMPLE BECOMES 1. git clone 2. pipenv install --dev 3. pipenv run check 4.
  • 53. WHERE DOES PIPENV FALLWHERE DOES PIPENV FALL SHORT?SHORT?
  • 54. PIPENV IS A TOP-NOTCH TOOL FORPIPENV IS A TOP-NOTCH TOOL FOR MANAGING AN APPLICATION WHICH:MANAGING AN APPLICATION WHICH: Runs on one version of Python. Isn't used as a dependency. Isn't packaged for PyPi etc.
  • 55. PIPFILES DECLARE AN EXPECTED VERSIONPIPFILES DECLARE AN EXPECTED VERSION OF PYTHONOF PYTHON
  • 56. PIPFILE.LOCK RIGIDLY FIXES DEPENDENCYPIPFILE.LOCK RIGIDLY FIXES DEPENDENCY VERSIONSVERSIONS (which doesn't suit usage as a dependency)
  • 57. PIPENV WON'T HELP WITH PACKAGEPIPENV WON'T HELP WITH PACKAGE CONFIGURATIONCONFIGURATION
  • 58. IF THOSE ASSUMPTIONS DON'TIF THOSE ASSUMPTIONS DON'T SUIT YOU?SUIT YOU?
  • 60. POETRY IS A SOMEWHAT FULLER-POETRY IS A SOMEWHAT FULLER- FEATURED TOOL FOR DEPENDENCYFEATURED TOOL FOR DEPENDENCY MANAGEMENT.MANAGEMENT.
  • 61. Poetry is a little more involved, and uses more metadata. This equips it to support packaging and publishing, in addition to dependency management.
  • 62. IF YOU USE PYENV TO MANAGE YOURIF YOU USE PYENV TO MANAGE YOUR PYTHON VERSIONSPYTHON VERSIONS AND PIPENV OR POETRY TO MANAGEAND PIPENV OR POETRY TO MANAGE YOUR PROJECTSYOUR PROJECTS
  • 63. IT'S A LOT LESS BITE FOR EVERYONE.IT'S A LOT LESS BITE FOR EVERYONE. Party danger noodle!
  • 64. FIN.FIN.    Want to follow up later? I'm on Twitter: @LIAMDAWS@LIAMDAWS
  • 65. CREDITSCREDITS Elephant photo by on Unsplash Original snake photo by on Unsplash Inbetween Architects Boris Smokrovic