CINXE.COM

Python Software Foundation News: pip

<!DOCTYPE html> <html class='v2' dir='ltr' lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'> <head> <link href='https://www.blogger.com/static/v1/widgets/3566091532-css_bundle_v2.css' rel='stylesheet' type='text/css'/> <!-- Google tag (gtag.js) --> <script async='async' src='https://www.googletagmanager.com/gtag/js?id=G-H6ZX4B41B7'></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-H6ZX4B41B7'); </script> <meta content='Python Software Foundation Blog' property='og:site_name'/> <meta content='https://pyfound.blogspot.com' property='og:url'/> <meta content='' property='og:description'/> <meta content='' property='og:type'/> <meta content='https://s3.dualstack.us-east-2.amazonaws.com/pythondotorg-assets/media/psf/grants/report-2006-10/psf-logo.png' property='og:image'/> <meta content='width=1100' name='viewport'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='blogger' name='generator'/> <link href='https://pyfound.blogspot.com/favicon.ico' rel='icon' type='image/x-icon'/> <link href='https://pyfound.blogspot.com/search/label/pip' rel='canonical'/> <link rel="alternate" type="application/atom+xml" title="Python Software Foundation News - Atom" href="https://pyfound.blogspot.com/feeds/posts/default" /> <link rel="alternate" type="application/rss+xml" title="Python Software Foundation News - RSS" href="https://pyfound.blogspot.com/feeds/posts/default?alt=rss" /> <link rel="service.post" type="application/atom+xml" title="Python Software Foundation News - Atom" href="https://www.blogger.com/feeds/8520/posts/default" /> <!--Can't find substitution for tag [blog.ieCssRetrofitLinks]--> <meta content='https://pyfound.blogspot.com/search/label/pip' property='og:url'/> <meta content='Python Software Foundation News' property='og:title'/> <meta content='聽聽News from the Python Software Foundation' property='og:description'/> <title>Python Software Foundation News: pip</title> <style id='page-skin-1' type='text/css'><!-- /* ----------------------------------------------- Blogger Template Style Name: Simple Designer: Blogger URL: www.blogger.com ----------------------------------------------- */ /* Variable definitions ==================== <Variable name="keycolor" description="Main Color" type="color" default="#66bbdd"/> <Group description="Page Text" selector="body"> <Variable name="body.font" description="Font" type="font" default="normal normal 12px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="body.text.color" description="Text Color" type="color" default="#222222"/> </Group> <Group description="Backgrounds" selector=".body-fauxcolumns-outer"> <Variable name="body.background.color" description="Outer Background" type="color" default="#66bbdd"/> <Variable name="content.background.color" description="Main Background" type="color" default="#ffffff"/> <Variable name="header.background.color" description="Header Background" type="color" default="transparent"/> </Group> <Group description="Links" selector=".main-outer"> <Variable name="link.color" description="Link Color" type="color" default="#2288bb"/> <Variable name="link.visited.color" description="Visited Color" type="color" default="#888888"/> <Variable name="link.hover.color" description="Hover Color" type="color" default="#33aaff"/> </Group> <Group description="Blog Title" selector=".header h1"> <Variable name="header.font" description="Font" type="font" default="normal normal 60px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="header.text.color" description="Title Color" type="color" default="#3399bb" /> </Group> <Group description="Blog Description" selector=".header .description"> <Variable name="description.text.color" description="Description Color" type="color" default="#777777" /> </Group> <Group description="Tabs Text" selector=".tabs-inner .widget li a"> <Variable name="tabs.font" description="Font" type="font" default="normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="tabs.text.color" description="Text Color" type="color" default="#999999"/> <Variable name="tabs.selected.text.color" description="Selected Color" type="color" default="#000000"/> </Group> <Group description="Tabs Background" selector=".tabs-outer .PageList"> <Variable name="tabs.background.color" description="Background Color" type="color" default="#f5f5f5"/> <Variable name="tabs.selected.background.color" description="Selected Color" type="color" default="#eeeeee"/> </Group> <Group description="Post Title" selector="h3.post-title, .comments h4"> <Variable name="post.title.font" description="Font" type="font" default="normal normal 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> </Group> <Group description="Date Header" selector=".date-header"> <Variable name="date.header.color" description="Text Color" type="color" default="#666666"/> <Variable name="date.header.background.color" description="Background Color" type="color" default="transparent"/> <Variable name="date.header.font" description="Text Font" type="font" default="normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="date.header.padding" description="Date Header Padding" type="string" default="inherit"/> <Variable name="date.header.letterspacing" description="Date Header Letter Spacing" type="string" default="inherit"/> <Variable name="date.header.margin" description="Date Header Margin" type="string" default="inherit"/> </Group> <Group description="Post Footer" selector=".post-footer"> <Variable name="post.footer.text.color" description="Text Color" type="color" default="#666666"/> <Variable name="post.footer.background.color" description="Background Color" type="color" default="#f9f9f9"/> <Variable name="post.footer.border.color" description="Shadow Color" type="color" default="#eeeeee"/> </Group> <Group description="Gadgets" selector="h2"> <Variable name="widget.title.font" description="Title Font" type="font" default="normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="widget.title.text.color" description="Title Color" type="color" default="#000000"/> <Variable name="widget.alternate.text.color" description="Alternate Color" type="color" default="#999999"/> </Group> <Group description="Images" selector=".main-inner"> <Variable name="image.background.color" description="Background Color" type="color" default="#ffffff"/> <Variable name="image.border.color" description="Border Color" type="color" default="#eeeeee"/> <Variable name="image.text.color" description="Caption Text Color" type="color" default="#666666"/> </Group> <Group description="Accents" selector=".content-inner"> <Variable name="body.rule.color" description="Separator Line Color" type="color" default="#eeeeee"/> <Variable name="tabs.border.color" description="Tabs Border Color" type="color" default="#ffd343"/> </Group> <Variable name="body.background" description="Body Background" type="background" color="#eeeeee" default="$(color) none repeat scroll top left"/> <Variable name="body.background.override" description="Body Background Override" type="string" default=""/> <Variable name="body.background.gradient.cap" description="Body Gradient Cap" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/gradients_light.png)"/> <Variable name="body.background.gradient.tile" description="Body Gradient Tile" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/body_gradient_tile_light.png)"/> <Variable name="content.background.color.selector" description="Content Background Color Selector" type="string" default=".content-inner"/> <Variable name="content.padding" description="Content Padding" type="length" default="10px" min="0" max="100px"/> <Variable name="content.padding.horizontal" description="Content Horizontal Padding" type="length" default="10px" min="0" max="100px"/> <Variable name="content.shadow.spread" description="Content Shadow Spread" type="length" default="40px" min="0" max="100px"/> <Variable name="content.shadow.spread.webkit" description="Content Shadow Spread (WebKit)" type="length" default="5px" min="0" max="100px"/> <Variable name="content.shadow.spread.ie" description="Content Shadow Spread (IE)" type="length" default="10px" min="0" max="100px"/> <Variable name="main.border.width" description="Main Border Width" type="length" default="0" min="0" max="10px"/> <Variable name="header.background.gradient" description="Header Gradient" type="url" default="none"/> <Variable name="header.shadow.offset.left" description="Header Shadow Offset Left" type="length" default="-1px" min="-50px" max="50px"/> <Variable name="header.shadow.offset.top" description="Header Shadow Offset Top" type="length" default="-1px" min="-50px" max="50px"/> <Variable name="header.shadow.spread" description="Header Shadow Spread" type="length" default="1px" min="0" max="100px"/> <Variable name="header.padding" description="Header Padding" type="length" default="30px" min="0" max="100px"/> <Variable name="header.border.size" description="Header Border Size" type="length" default="1px" min="0" max="10px"/> <Variable name="header.bottom.border.size" description="Header Bottom Border Size" type="length" default="1px" min="0" max="10px"/> <Variable name="header.border.horizontalsize" description="Header Horizontal Border Size" type="length" default="0" min="0" max="10px"/> <Variable name="description.text.size" description="Description Text Size" type="string" default="140%"/> <Variable name="tabs.margin.top" description="Tabs Margin Top" type="length" default="0" min="0" max="100px"/> <Variable name="tabs.margin.side" description="Tabs Side Margin" type="length" default="30px" min="0" max="100px"/> <Variable name="tabs.background.gradient" description="Tabs Background Gradient" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/gradients_light.png)"/> <Variable name="tabs.border.width" description="Tabs Border Width" type="length" default="1px" min="0" max="10px"/> <Variable name="tabs.bevel.border.width" description="Tabs Bevel Border Width" type="length" default="1px" min="0" max="10px"/> <Variable name="post.margin.bottom" description="Post Bottom Margin" type="length" default="25px" min="0" max="100px"/> <Variable name="image.border.small.size" description="Image Border Small Size" type="length" default="2px" min="0" max="10px"/> <Variable name="image.border.large.size" description="Image Border Large Size" type="length" default="5px" min="0" max="10px"/> <Variable name="page.width.selector" description="Page Width Selector" type="string" default=".region-inner"/> <Variable name="page.width" description="Page Width" type="string" default="auto"/> <Variable name="main.section.margin" description="Main Section Margin" type="length" default="15px" min="0" max="100px"/> <Variable name="main.padding" description="Main Padding" type="length" default="15px" min="0" max="100px"/> <Variable name="main.padding.top" description="Main Padding Top" type="length" default="30px" min="0" max="100px"/> <Variable name="main.padding.bottom" description="Main Padding Bottom" type="length" default="30px" min="0" max="100px"/> <Variable name="paging.background" color="#ffffff" description="Background of blog paging area" type="background" default="transparent none no-repeat scroll top center"/> <Variable name="footer.bevel" description="Bevel border length of footer" type="length" default="0" min="0" max="10px"/> <Variable name="mobile.background.overlay" description="Mobile Background Overlay" type="string" default="transparent none repeat scroll top left"/> <Variable name="mobile.background.size" description="Mobile Background Size" type="string" default="auto"/> <Variable name="mobile.button.color" description="Mobile Button Color" type="color" default="#ffffff" /> <Variable name="startSide" description="Side where text starts in blog language" type="automatic" default="left"/> <Variable name="endSide" description="Side where text ends in blog language" type="automatic" default="right"/> */ /* Content ----------------------------------------------- */ body { font: normal normal 12px 'Trebuchet MS', Trebuchet, Verdana, sans-serif; color: #666666; background: #eeeeee none repeat scroll top left; padding: 0 0 0 0; } html body .region-inner { min-width: 0; max-width: 100%; width: auto; } h2 { font-size: 22px; } a:link { text-decoration:none; color: #2b5b84; } a:visited { text-decoration:none; color: #2b5b84; } a:hover { text-decoration:underline; color: #3776ab; } .body-fauxcolumn-outer .fauxcolumn-inner { background: transparent none repeat scroll top left; _background-image: none; } .body-fauxcolumn-outer .cap-top { position: absolute; z-index: 1; height: 400px; width: 100%; } .body-fauxcolumn-outer .cap-top .cap-left { width: 100%; background: transparent none repeat-x scroll top left; _background-image: none; } .content-outer { -moz-box-shadow: 0 0 0 rgba(0, 0, 0, .15); -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .15); -goog-ms-box-shadow: 0 0 0 #333333; box-shadow: 0 0 0 rgba(0, 0, 0, .15); margin-bottom: 1px; } .content-inner { padding: 10px 40px; } .content-inner { background-color: #ffffff; } /* Header ----------------------------------------------- */ .header-outer { background: #2b5b84 none repeat-x scroll 0 -400px; _background-image: none; } .Header h1 { font: normal normal 40px 'Trebuchet MS',Trebuchet,Verdana,sans-serif; color: #000000; text-shadow: 0 0 0 rgba(0, 0, 0, .2); } .Header h1 a { color: #000000; } .Header .description { font-size: 18px; color: #ffd343; } .header-inner .Header .titlewrapper { padding: 22px 0; } .header-inner .Header .descriptionwrapper { padding: 0 0; } /* Tabs ----------------------------------------------- */ .tabs-inner .section:first-child { border-top: 0 solid #dddddd; } .tabs-inner .section:first-child ul { margin-top: -1px; border-top: 1px solid #dddddd; border-left: 1px solid #dddddd; border-right: 1px solid #dddddd; } .tabs-inner .widget ul { background: transparent none repeat-x scroll 0 -800px; _background-image: none; border-bottom: 1px solid #dddddd; margin-top: 0; margin-left: -30px; margin-right: -30px; } .tabs-inner .widget li a { display: inline-block; padding: .6em 1em; font: normal normal 12px 'Trebuchet MS', Trebuchet, Verdana, sans-serif; color: #000000; border-left: 1px solid #ffffff; border-right: 1px solid #dddddd; } .tabs-inner .widget li:first-child a { border-left: none; } .tabs-inner .widget li.selected a, .tabs-inner .widget li a:hover { color: #000000; background-color: #eeeeee; text-decoration: none; } /* Columns ----------------------------------------------- */ .main-outer { border-top: 0 solid #ffd343; } .fauxcolumn-left-outer .fauxcolumn-inner { border-right: 1px solid #ffd343; } .fauxcolumn-right-outer .fauxcolumn-inner { border-left: 1px solid #ffd343; } /* Headings ----------------------------------------------- */ div.widget > h2, div.widget h2.title { margin: 0 0 1em 0; font: normal bold 11px 'Trebuchet MS',Trebuchet,Verdana,sans-serif; color: #000000; } /* Widgets ----------------------------------------------- */ .widget .zippy { color: #999999; text-shadow: 2px 2px 1px rgba(0, 0, 0, .1); } .widget .popular-posts ul { list-style: none; } /* Posts ----------------------------------------------- */ h2.date-header { font: normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif; } .date-header span { background-color: #bbbbbb; color: #ffffff; padding: 0.4em; letter-spacing: 3px; margin: inherit; } .main-inner { padding-top: 35px; padding-bottom: 65px; } .main-inner .column-center-inner { padding: 0 0; } .main-inner .column-center-inner .section { margin: 0 1em; } .post { margin: 0 0 45px 0; } h3.post-title, .comments h4 { font: normal normal 22px 'Trebuchet MS',Trebuchet,Verdana,sans-serif; margin: .75em 0 0; } .post-body { font-size: 110%; line-height: 1.4; position: relative; } .post-body img, .post-body .tr-caption-container, .Profile img, .Image img, .BlogList .item-thumbnail img { padding: 2px; background: #ffffff; border: 1px solid #eeeeee; -moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); } .post-body img, .post-body .tr-caption-container { padding: 5px; } .post-body .tr-caption-container { color: #666666; } .post-body .tr-caption-container img { padding: 0; background: transparent; border: none; -moz-box-shadow: 0 0 0 rgba(0, 0, 0, .1); -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .1); box-shadow: 0 0 0 rgba(0, 0, 0, .1); } .post-header { margin: 0 0 1.5em; line-height: 1.6; font-size: 90%; } .post-footer { margin: 20px -2px 0; padding: 5px 10px; color: #666666; background-color: #eeeeee; border-bottom: 1px solid #eeeeee; line-height: 1.6; font-size: 90%; } #comments .comment-author { padding-top: 1.5em; border-top: 1px solid #ffd343; background-position: 0 1.5em; } #comments .comment-author:first-child { padding-top: 0; border-top: none; } .avatar-image-container { margin: .2em 0 0; } #comments .avatar-image-container img { border: 1px solid #eeeeee; } /* Comments ----------------------------------------------- */ .comments .comments-content .icon.blog-author { background-repeat: no-repeat; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9sLFwMeCjjhcOMAAAD+SURBVDjLtZSvTgNBEIe/WRRnm3U8RC1neQdsm1zSBIU9VVF1FkUguQQsD9ITmD7ECZIJSE4OZo9stoVjC/zc7ky+zH9hXwVwDpTAWWLrgS3QAe8AZgaAJI5zYAmc8r0G4AHYHQKVwII8PZrZFsBFkeRCABYiMh9BRUhnSkPTNCtVXYXURi1FpBDgArj8QU1eVXUzfnjv7yP7kwu1mYrkWlU33vs1QNu2qU8pwN0UpKoqokjWwCztrMuBhEhmh8bD5UDqur75asbcX0BGUB9/HAMB+r32hznJgXy2v0sGLBcyAJ1EK3LFcbo1s91JeLwAbwGYu7TP/3ZGfnXYPgAVNngtqatUNgAAAABJRU5ErkJggg==); } .comments .comments-content .loadmore a { border-top: 1px solid #999999; border-bottom: 1px solid #999999; } .comments .comment-thread.inline-thread { background-color: #eeeeee; } .comments .continue { border-top: 2px solid #999999; } /* Accents ---------------------------------------------- */ .section-columns td.columns-cell { border-left: 1px solid #ffd343; } .blog-pager { background: transparent url(//www.blogblog.com/1kt/simple/paging_dot.png) repeat-x scroll top center; } .blog-pager-older-link, .home-link, .blog-pager-newer-link { background-color: #ffffff; padding: 5px; } .footer-outer { border-top: 1px dashed #bbbbbb; } /* Mobile ----------------------------------------------- */ body.mobile { background-size: auto; } .mobile .body-fauxcolumn-outer { background: transparent none repeat scroll top left; } .mobile .body-fauxcolumn-outer .cap-top { background-size: 100% auto; } .mobile .content-outer { -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, .15); box-shadow: 0 0 3px rgba(0, 0, 0, .15); } .mobile .tabs-inner .widget ul { margin-left: 0; margin-right: 0; } .mobile .post { margin: 0; } .mobile .main-inner .column-center-inner .section { margin: 0; } .mobile .date-header span { padding: 0.1em 10px; margin: 0 -10px; } .mobile h3.post-title { margin: 0; } .mobile .blog-pager { background: transparent none no-repeat scroll top center; } .mobile .footer-outer { border-top: none; } .mobile .main-inner, .mobile .footer-inner { background-color: #ffffff; } .mobile-index-contents { color: #666666; } .mobile-link-button { background-color: #2b5b84; } .mobile-link-button a:link, .mobile-link-button a:visited { color: #ffffff; } .mobile .tabs-inner .section:first-child { border-top: none; } .mobile .tabs-inner .PageList .widget-content { background-color: #eeeeee; color: #000000; border-top: 1px solid #dddddd; border-bottom: 1px solid #dddddd; } .mobile .tabs-inner .PageList .widget-content .pagelist-arrow { border-left: 1px solid #dddddd; } --></style> <style id='template-skin-1' type='text/css'><!-- body { min-width: 960px; } .content-outer, .content-fauxcolumn-outer, .region-inner { min-width: 960px; max-width: 960px; _width: 960px; } .main-inner .columns { padding-left: 0; padding-right: 310px; } .main-inner .fauxcolumn-center-outer { left: 0; right: 310px; /* IE6 does not respect left and right together */ _width: expression(this.parentNode.offsetWidth - parseInt("0") - parseInt("310px") + 'px'); } .main-inner .fauxcolumn-left-outer { width: 0; } .main-inner .fauxcolumn-right-outer { width: 310px; } .main-inner .column-left-outer { width: 0; right: 100%; margin-left: -0; } .main-inner .column-right-outer { width: 310px; margin-right: -310px; } #layout { min-width: 0; } #layout .content-outer { min-width: 0; width: 800px; } #layout .region-inner { min-width: 0; width: auto; } body#layout div.add_widget { padding: 8px; } body#layout div.add_widget a { margin-left: 32px; } --></style> <script type='text/javascript'> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-55961911-3', 'auto', 'blogger'); ga('blogger.send', 'pageview'); </script> <link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=8520&amp;zx=2762d9e9-a718-40bd-a578-e71de55acc55' media='none' onload='if(media!=&#39;all&#39;)media=&#39;all&#39;' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=8520&amp;zx=2762d9e9-a718-40bd-a578-e71de55acc55' rel='stylesheet'/></noscript> <meta name='google-adsense-platform-account' content='ca-host-pub-1556223355139109'/> <meta name='google-adsense-platform-domain' content='blogspot.com'/> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?display=swap&family=Montserrat"></head> <body class='loading'> <div class='navbar section' id='navbar' name='Navbar'><div class='widget Navbar' data-version='1' id='Navbar1'><script type="text/javascript"> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener('load', function(){ object[attribute] = val; }, false); } else { window.attachEvent('onload', function(){ object[attribute] = val; }); } } </script> <div id="navbar-iframe-container"></div> <script type="text/javascript" src="https://apis.google.com/js/platform.js"></script> <script type="text/javascript"> gapi.load("gapi.iframes:gapi.iframes.style.bubble", function() { if (gapi.iframes && gapi.iframes.getContext) { gapi.iframes.getContext().openChild({ url: 'https://www.blogger.com/navbar/8520?origin\x3dhttps://pyfound.blogspot.com', where: document.getElementById("navbar-iframe-container"), id: "navbar-iframe" }); } }); </script><script type="text/javascript"> (function() { var script = document.createElement('script'); script.type = 'text/javascript'; script.src = '//pagead2.googlesyndication.com/pagead/js/google_top_exp.js'; var head = document.getElementsByTagName('head')[0]; if (head) { head.appendChild(script); }})(); </script> </div></div> <div itemscope='itemscope' itemtype='http://schema.org/Blog' style='display: none;'> <meta content='Python Software Foundation News' itemprop='name'/> </div> <div class='body-fauxcolumns'> <div class='fauxcolumn-outer body-fauxcolumn-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <div class='content'> <div class='content-fauxcolumns'> <div class='fauxcolumn-outer content-fauxcolumn-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <div class='content-outer'> <div class='content-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left content-fauxborder-left'> <div class='fauxborder-right content-fauxborder-right'></div> <div class='content-inner'> <header> <div class='header-outer'> <div class='header-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left header-fauxborder-left'> <div class='fauxborder-right header-fauxborder-right'></div> <div class='region-inner header-inner'> <div class='header section' id='header' name='Header'><div class='widget Header' data-version='1' id='Header1'> <div id='header-inner'> <a href='https://pyfound.blogspot.com/' style='display: block'> <img alt='Python Software Foundation News' height='82px; ' id='Header1_headerimg' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD_WIGHsseqGaGnsXVjcNYZ5g6EIb1XoDEmltAoM6Bi6_R9uDS1BPJP9oPJKj1k4I5R8ALUVZZfy4_DLjEDs6i2GxsCDnf3xO5eo54utZQ5E2pyUhtbQGOiiwBrmLU5asONQ/s1600-r/psf-logo.png' style='display: block' width='334px; '/> </a> <div class='descriptionwrapper'> <p class='description'><span>&#160;&#160;News from the Python Software Foundation</span></p> </div> </div> </div></div> </div> </div> <div class='header-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </header> <div class='tabs-outer'> <div class='tabs-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left tabs-fauxborder-left'> <div class='fauxborder-right tabs-fauxborder-right'></div> <div class='region-inner tabs-inner'> <div class='tabs no-items section' id='crosscol' name='Cross-Column'></div> <div class='tabs no-items section' id='crosscol-overflow' name='Cross-Column 2'></div> </div> </div> <div class='tabs-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='main-outer'> <div class='main-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left main-fauxborder-left'> <div class='fauxborder-right main-fauxborder-right'></div> <div class='region-inner main-inner'> <div class='columns fauxcolumns'> <div class='fauxcolumn-outer fauxcolumn-center-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='fauxcolumn-outer fauxcolumn-left-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='fauxcolumn-outer fauxcolumn-right-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <!-- corrects IE6 width calculation --> <div class='columns-inner'> <div class='column-center-outer'> <div class='column-center-inner'> <div class='main section' id='main' name='Main'><div class='widget Blog' data-version='1' id='Blog1'> <div class='blog-posts hfeed'> <div class='status-msg-wrap'> <div class='status-msg-body'> Showing posts with label <b>pip</b>. <a href="https://pyfound.blogspot.com/">Show all posts</a> </div> <div class='status-msg-border'> <div class='status-msg-bg'> <div class='status-msg-hidden'>Showing posts with label <b>pip</b>. <a href="https://pyfound.blogspot.com/">Show all posts</a></div> </div> </div> </div> <div style='clear: both;'></div> <div class="date-outer"> <h2 class='date-header'><span>Monday, November 30, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='https://i.ytimg.com/vi/B4GQCBBsuNU/hqdefault.jpg' itemprop='image_url'/> <meta content='8520' itemprop='blogId'/> <meta content='7929121820068634610' itemprop='postId'/> <a name='7929121820068634610'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html'>Releasing pip 20.3, featuring new dependency resolver</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-7929121820068634610' itemprop='description articleBody'> <p>On behalf of the <a href="https://www.pypa.io">Python Packaging Authority</a> and the pip team, I am pleased to announce that <b>we have just released pip 20.3</b>, a new version of pip. You can install it by running <code>python -m pip install --upgrade pip</code>.</p> <p>This is an important and disruptive release -- we <a href="https://pyfound.blogspot.com/2019/12/moss-czi-support-pip.html" rel="nofollow">explained why in a blog post last year</a>. We've even made <a href="https://www.youtube.com/watch?v=B4GQCBBsuNU" rel="nofollow">a video about it</a>.</p> <p><iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube-nocookie.com/embed/B4GQCBBsuNU" width="560"></iframe></p> <h2 style="text-align: left;">Highlights</h2> <ul><li> <p><b>DISRUPTION</b>: Switch to the new dependency resolver by default. Watch out for changes in handling editable installs, constraints files, and more: <a href="https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020" rel="nofollow">https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020</a></p> </li><li> <p><b>DEPRECATION</b>: Deprecate support for Python 3.5 (to be removed in pip 21.0).</p> </li><li> <p><b>DEPRECATION</b>: pip freeze will stop filtering the pip, setuptools, distribute and wheel packages from pip freeze output in a future version. To keep the previous behavior, users should use the new <code>--exclude</code> option.</p> </li><li> <p>Substantial improvements in new resolver for performance, output and error messages, avoiding infinite loops, and support for constraints files.</p> </li><li> <p>Support for PEP 600: Future <code>manylinux</code> Platform Tags for Portable Linux Built Distributions.</p> </li><li> <p>Documentation improvements: Resolver migration guide, quickstart guide, and new documentation theme.</p> </li><li> <p>Add support for MacOS Big Sur compatibility tags.</p> </li></ul> <p>The new resolver is now <i>on by default</i> for Python 3 users. It is significantly stricter and more consistent when it receives incompatible instructions, and reduces support for certain kinds of constraints files, so some workarounds and workflows may break. Please see <a href="https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020" rel="nofollow">our guide on how to test and migrate, and how to report issues</a>. You can use the deprecated (old) resolver, using the flag <code>--use-deprecated=legacy-resolver</code>, until we remove it in the pip 21.0 release in January 2021. <br /></p><p>You can find more details (including deprecations and removals) <a href="https://pip.pypa.io/en/stable/news/" rel="nofollow">in the changelog</a>.</p><div class="ace-line" id="magicdomid34" spellcheck="true"> <h2> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> </span></h2><div class="ace-line" id="magicdomid41" spellcheck="true"> <h2> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">Coming soon: end of Python 2.7 support</span></h2><div style="text-align: left;"><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">We aim to release pip 21.0 in January 2021, per our <a href="https://pip.pypa.io/en/latest/development/release-process/#release-cadence">release cadence</a>. At that time, pip will <a href="https://pip.pypa.io/en/latest/development/release-process/#python-2-support">stop supporting Python 2.7</a> and will therefore stop supporting Python 2 entirely.</span></div><div style="text-align: left;"><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">&nbsp;</span></div><div style="text-align: left;"><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">When users use pip 20.3 in a Python 2 environment, the old dependency resolver is still the default.<br /></span></div></div><h2><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">For more info or to contribute:</span></h2> </div> <div class="ace-line" id="magicdomid36" spellcheck="true"> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">We run this project as transparently as possible, so you can:</span></div> <div class="ace-line" id="magicdomid37" spellcheck="true"> <ul><li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">read and participate in <a href="https://github.com/pypa/pip/projects/6">GitHub issues</a></span></li><li><p>contribute to <a href="https://pip.pypa.io/en/stable/ux_research_design/">our user experience work</a>: <a href="https://bit.ly/pip-ux-studies">sign up to become a member of the UX Studies group</a> (after you join, we'll notify you about future UX surveys and interviews)</p></li></ul> </div> <div class="ace-line" id="magicdomid38" spellcheck="true"> <ul><li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">contact us in the <a href="https://discuss.python.org/t/an-update-on-pip-and-dependency-resolution/1898">Discourse</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"><a href="https://discuss.python.org/t/an-update-on-pip-and-dependency-resolution/1898"> forum</a> or <a href="https://python.zulipchat.com/#narrow/stream/218659-pip-development">Zulip chat</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo url"></span></li></ul> </div> <div class="ace-line" id="magicdomid39" spellcheck="true"> <ul><li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">read <a href="https://wiki.python.org/psf/PackagingWG#Dependency_resolver_and_user_experience_improvements_for_pip">our meeting notes</a></span></li></ul></div><div class="ace-line" id="magicdomid41" spellcheck="true"><h2><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">Thank you</span></h2> </div> <div class="ace-line" id="magicdomid43" spellcheck="true"> <span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">Thanks to our contractors on this project:</span> <a href="https://simplysecure.org/" rel="nofollow">Simply Secure</a> (specifically Georgia Bullen, Bernard Tyers, Nicole Harris, Ng峄峜 Tri峄噓, and Karissa McKelvey), <a href="https://changeset.nyc/" rel="nofollow">Changeset Consulting</a> (Sumana Harihareswara), <a href="https://www.atos.net" rel="nofollow">Atos</a> (Paul F. Moore), <a href="https://uranusjr.com" rel="nofollow">Tzu-ping Chung</a>, <a href="https://pradyunsg.me/" rel="nofollow">Pradyun Gedam</a>, and Ilan Schnell. Thanks also to Ernest W. Durbin III at the Python Software Foundation for liaising with the project.</div><div class="ace-line" id="magicdomid43" spellcheck="true"><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">&nbsp;</span></div> <div class="ace-line" id="magicdomid43" spellcheck="true"> </div> <div class="ace-line" id="magicdomid43" spellcheck="true"> <span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">This award continues our relationship with Mozilla, which supported Python packaging tools with <a href="https://pyfound.blogspot.com/2017/11/the-psf-awarded-moss-grant-pypi.html">a Mozilla Open Source Support Award in 2017 for Warehouse</a></span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n url"></span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">. Thank you, Mozilla! (MOSS has a number of types of awards, which are open to different sorts of open source/free software projects. If your project will seek financial support in 2021, do check <a href="https://www.mozilla.org/en-US/moss/">the MOSS website</a></span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n url"></span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n"> to see if you qualify.)</span></div> <div class="ace-line" id="magicdomid44" spellcheck="true"> <br /></div> <div class="ace-line" id="magicdomid45" spellcheck="true"> <span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">This is new funding from the Chan Zuckerberg Initiative. This project is being made possible in part by a grant from the Chan Zuckerberg Initiative DAF, an advised fund of Silicon Valley Community Foundation. Thank you, CZI! (If your free software/open source project is seeking funding and is used by researchers, check </span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n"><a href="https://investinopen.org/blog/jrost-rapid-response-fund/">the Joint Roadmap for Open Science Tools Rapid Response Fund</a> and consider applying.)</span></div><div class="ace-line" id="magicdomid45" spellcheck="true"><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">&nbsp;</span></div>The <a href="https://pyfound.blogspot.com/2019/12/moss-czi-support-pip.html">funding for pip's overhaul</a> will end at the end of 2020; if your organization wants to help continue <a href="https://github.com/psf/fundable-packaging-improvements/">improvements in Python packaging</a>, please join <a href="https://pyfound.blogspot.com/2020/04/sponsoring-python-packaging.html">the sponsorship program</a>.<br /><div class="ace-line" id="magicdomid46" spellcheck="true"> <br /></div> <div class="ace-line" id="magicdomid47" spellcheck="true"> <span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">As with all pip releases, a significant amount of the work was contributed by pip's user community. Huge thanks to all who have contributed, whether through code, documentation, issue reports and/or discussion. Your help keeps pip improving, and is hugely appreciated. Thank you to the pip and <a href="https://www.pypa.io/"><span id="goog_679598594"></span>PyPA</a></span><a href="https://www.blogger.com/"><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n url"></span></a><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n"><span id="goog_679598595"></span> maintainers, to the PSF and the Packaging WG, and to all the contributors and volunteers who work on or use Python packaging tools.</span></div><div class="ace-line" id="magicdomid47" spellcheck="true"><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">&nbsp;</span></div><div class="ace-line" id="magicdomid47" spellcheck="true" style="text-align: right;"><i><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">-Sumana </span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">Harihareswara, pip project manager</span></i></div> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/08002085909817689325' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/08002085909817689325' rel='author' title='author profile'> <span itemprop='name'>Sumana Harihareswara</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-11-30T07:53:00-05:00'>11/30/2020 07:53:00 AM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-1436657185'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=7929121820068634610&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> Labels: <a href='https://pyfound.blogspot.com/search/label/grant' rel='tag'>grant</a>, <a href='https://pyfound.blogspot.com/search/label/grants' rel='tag'>grants</a>, <a href='https://pyfound.blogspot.com/search/label/open%20source' rel='tag'>open source</a>, <a href='https://pyfound.blogspot.com/search/label/pip' rel='tag'>pip</a>, <a href='https://pyfound.blogspot.com/search/label/volunteer' rel='tag'>volunteer</a> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Tuesday, September 15, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='8520' itemprop='blogId'/> <meta content='7077217817458778019' itemprop='postId'/> <a name='7077217817458778019'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/09/answer-surveys-improve-pip-ux.html'>Answer these surveys to improve pip's usability</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-7077217817458778019' itemprop='description articleBody'> <p>The <a href="https://pip.pypa.io/">pip</a> team has been working on improving the usability of pip since the start of this year. We've been carrying this work out remotely - by interviewing pip users, by sending short surveys, and doing usability tests of new pip functions.</p> <p>We want to thank everybody who is contributing input to this work and are taking part in this research, which is still ongoing. We've learned a lot about who uses pip and how you use it. This has helped the team make decisions to improve pip, such as <a href="https://pip.pypa.io/en/latest/user_guide/#fixing-conflicting-dependencies">error messages and documentation to help you fix dependency conflicts</a>.</p> <p>Our team has put together a <a href="https://pip.pypa.io/en/latest/ux_research_design/">User Experience (UX) section in pip's documentation</a> to tell you about this UX work. It covers what has happened so far, how you can contribute, and what is coming in the future.</p> <h3>Contribute to current UX work</h3> <p>Right now, you can take part in a number of studies about:</p> <ol><li>What pip features do you use most, and what pip feature you'd like to see - <a href="https://docs.google.com/forms/d/1N-sE0LxdfZb2OUsBcwNILabnpPsb71IRAMWD9CKY6Uk/">give your input by completing this survey</a></li><li>How "<span style="font-family: courier;">pip force install</span>" should behave - <a href="https://docs.google.com/forms/d/1otpC59Yo667l9fiPPLPz8ivKr4GO3atXwy-B6pFhL1U">give your input by completing this survey</a></li><li>How "<span style="font-family: courier;">pip --force-reinstall</span>" should behave - <a href="https://docs.google.com/forms/d/1S2sAQMCmqJiS4Qp4HnRH196ph4oiS0nRhg9FgZMJzbg">give your input by completing this survey</a></li><li>Help create a design brief for a pip logo - <a href="https://docs.google.com/forms/d/17zzrIQVt-UymVSWPlKVZdci1HqNIvSGXmhNJbL9DYdA">give your input by completing this survey</a></li><li>What is your experience of using pip search - <a href="https://docs.google.com/forms/d/1-4kiVV8NnlkBrCr6x7eb8SobnS1RVRAR2xEl8iUeu24">give your input by completing this survey</a></li></ol> <p>If you have time, the team asks for you to answer all of these surveys. You can do them in your own time, all at once or over a few days.</p> <p>At the end of these surveys you can give your email address to be contacted for a short interview. These interviews will be via web conference/videocall.</p> <h3>Contribute to future pip UX work</h3> <p>If you want to contribute to our UX work in the future, please <a href="https://bit.ly/pip-ux-studies">sign up to become a member of the UX Studies group</a>.</p> <p>After you join, we'll notify you about future UX Studies (surveys and interviews).</p> <h3>Contacting the pip UX Team</h3> <p>You can contact the pip UX Team <a class="notion-link-token notion-enable-hover" data-reactroot="" data-token-index="2" href="mailto:pip-ux@pypa.io?subject=Contact%20from%20PSF%20blog" rel="noopener noreferrer" style="color: inherit; cursor: pointer; overflow-wrap: break-word; text-decoration: inherit;" target="_blank"><span style="border-bottom: 0.05em solid rgba(55, 53, 47, 0.4); border-color: rgba(55, 53, 47, 0.4); opacity: 0.7;">by</span></a><a class="notion-link-token notion-enable-hover" data-reactroot="" data-token-index="3" href="mailto:pip-ux@pypa.io" rel="noopener noreferrer" style="color: inherit; cursor: pointer; overflow-wrap: break-word; text-decoration: inherit;" target="_blank"><span style="border-bottom: 0.05em solid rgba(55, 53, 47, 0.4); border-color: rgba(55, 53, 47, 0.4); opacity: 0.7;"> email</span></a>. <br /></p> <p>We look forward to talking with you!</p><p style="text-align: right;">-Bernard Tyers, user experience, pip team&nbsp;</p><p style="text-align: right;">Sumana Harihareswara, project manager, pip team<br /></p> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/08002085909817689325' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/08002085909817689325' rel='author' title='author profile'> <span itemprop='name'>Sumana Harihareswara</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/09/answer-surveys-improve-pip-ux.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/09/answer-surveys-improve-pip-ux.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-09-15T08:17:00-04:00'>9/15/2020 08:17:00 AM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-1436657185'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=7077217817458778019&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> Labels: <a href='https://pyfound.blogspot.com/search/label/grant' rel='tag'>grant</a>, <a href='https://pyfound.blogspot.com/search/label/grants' rel='tag'>grants</a>, <a href='https://pyfound.blogspot.com/search/label/open%20source' rel='tag'>open source</a>, <a href='https://pyfound.blogspot.com/search/label/pip' rel='tag'>pip</a>, <a href='https://pyfound.blogspot.com/search/label/user%20experience' rel='tag'>user experience</a>, <a href='https://pyfound.blogspot.com/search/label/volunteer' rel='tag'>volunteer</a> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Monday, July 13, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='8520' itemprop='blogId'/> <meta content='6298634573721150667' itemprop='postId'/> <a name='6298634573721150667'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/07/pip-team-midyear-report.html'>Pip team midyear report</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-6298634573721150667' itemprop='description articleBody'> <div class="ace-line" id="magicdomid2" spellcheck="true"> <h1> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo"></span></h1> </div> <div class="ace-line" id="magicdomid3" spellcheck="true"> </div> <div class="ace-line" id="magicdomid5" spellcheck="true"> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">The <a href="https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html">grant-funded team working on improvements to pip</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> in 2020 has now passed the halfway mark. Here's an update on where are so far and what's next.</span></div> <div class="ace-line" id="magicdomid7" spellcheck="true"> <h2> <span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">Funding and Timeline Status</span></h2> </div> <div class="ace-line" id="magicdomid10" spellcheck="true"> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">The plan that we proposed last year said that, by now, we would have finished Foundational work (Phase I) and Resolver work (Phase II), and the team would be doing Maintenance and Sustainability work (Phase III). Please see </span><a href="https://wiki.python.org/psf/Pip2020DonorFundedRoadmap"><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"></span></a><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"><a href="https://wiki.python.org/psf/Pip2020DonorFundedRoadmap">the timeline for user experience work</a> and </span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"><a href="https://github.com/python/request-for/blob/master/2020-pip/RFP.md#scope">the timelines for development work</a>.</span></div> <div class="ace-line" id="magicdomid11" spellcheck="true"> <br /></div> <div class="ace-line" id="magicdomid12" spellcheck="true"> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">We are behind where we had planned to be in the work roadmap. This is partially because the COVID-19 pandemic disrupted our work, but also because of policy and architecture decisions the project needed, and because foundational user experience research work has taken more time than we originally allotted. Thus, we have finished <a href="https://github.com/python/request-for/blob/master/2020-pip/RFP.md#scope">the Phase I and Phase II sections of the development work</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">, and are approximately 75% of the way through <a href="https://wiki.python.org/psf/Pip2020DonorFundedRoadmap#Detailed_work_plan">the Phase I and Phase II user experience work</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">. See below for accomplishments so far.</span></div> <div class="ace-line" id="magicdomid13" spellcheck="true"> <br /></div> <div class="ace-line" id="magicdomid14" spellcheck="true"> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">Funding: we predicted that we would be approximately 80% of the way through our one-year project budget (since the second half of the year has a slower work pace, primarily focusing on maintaining and deepening the work we started in the first half). We are now approximately 71% of the way through the budget, which gives us flexibility for the second half of the project.</span></div> <div class="ace-line" id="magicdomid16" spellcheck="true"> <h2> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">Accomplishments</span></h2> </div> <div class="ace-line" id="magicdomid17" spellcheck="true"> <ul class="list-bullet1"> <li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo b"><b>Multiple pip releases</b></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> (<a href="https://pip.pypa.io/en/latest/news/">changelog</a>) since we started in January</span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">, including </span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"><a href="https://github.com/pypa/pip/pulls?q=is%3Apr+is%3Amerged+merged%3A%3E%3D2020-01-10">332 pull requests merged since we kicked off</a> (out of 2637 merged since 2011), and including improvements to the resolver library resolvelib:</span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> <a href="https://github.com/sarugaku/resolvelib/pulls?q=is%3Apr+is%3Amerged+merged%3A%3E2020-01-10">22 pull requests merged since we kicked off</a></span></li> </ul> </div> <div class="ace-line" id="magicdomid18" spellcheck="true"> <ul class="list-bullet1"> <li><span class="author-a-yz84zkxz71zqz84zkz122zz65zyq2z71zan b"><b>p</b></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo b"><b>ip's new dependency resolver </b></span><span class="author-a-yz84zkxz71zqz84zkz122zz65zyq2z71zan b"><b>is </b></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo b"><b>about to go into beta.</b></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> We released pip 20.1 in April which included an alpha version of the new resolver (hidden behind an optional "<span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">--unstable-feature=resolver</span>" flag, but usable). <a href="https://github.com/pypa/pip/issues/8511">This month we will release pip 20.2</a>, which will include a robust beta of the new resolver (hidden behind an optional "<span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">--use-feature=2020-resolver</span>" flag) that we will encourage users to test.</span></li> </ul> </div> <div class="ace-line" id="magicdomid19" spellcheck="true"> <ul class="list-bullet1"> <li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo b"><b>User experience data-gathering</b></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> included:</span></li> </ul> </div> <div class="ace-line" id="magicdomid20" spellcheck="true"> <ul class="list-bullet2"><ul> <li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">Recruited over 200 Python community members to be part of the UX research "panel" of respondents (<a href="http://www.ei8fdb.org/thoughts/2020/03/pip-ux-study-recruitment/">sign up if you are interested</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">)</span></li> </ul> </ul> </div> <div class="ace-line" id="magicdomid21" spellcheck="true"> <ul class="list-bullet2"><ul> <li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">Administered 5 surveys to gather feedback about issues with the pip resolver and dependency management</span></li> </ul> </ul> </div> <div class="ace-line" id="magicdomid22" spellcheck="true"> <ul class="list-bullet2"><ul> <li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">Interviewed and/or did user tests with over 30 maintainers and users so far</span></li> </ul> </ul> </div> <div class="ace-line" id="magicdomid23" spellcheck="true"> <ul class="list-bullet1"> <li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo b"><b>UX findings</b></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> and resulting improvements included:</span></li> </ul> </div> <div class="ace-line" id="magicdomid24" spellcheck="true"> <ul class="list-bullet2"><ul> <li><a href="https://www.notion.so/Error-message-format-and-guidelines-7b4ede077ad54c10a8f4182795fb949d"><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"></span></a><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"><a href="https://www.notion.so/Error-message-format-and-guidelines-7b4ede077ad54c10a8f4182795fb949d">Preliminary error message formatting guidelines</a> and</span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> <a href="https://editor.apps.ei8fdb.org/s/rylD-Qp3L#">preliminary research findings to improve the <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">ResolutionImpossible</span> error message's format and content</a>, which have now <a href="https://github.com/pypa/pip/issues/8377">been implemented</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo url"></span></li> </ul> </ul> </div> <div class="ace-line" id="magicdomid25" spellcheck="true"> <ul class="list-bullet2"><ul> <li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">Improved <a href="https://pip.pypa.io/en/latest/user_guide/#fixing-conflicting-dependencies">documentation to help users fix conflicting dependencies</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> </span></li> </ul> </ul> </div> <div class="ace-line" id="magicdomid26" spellcheck="true"> <ul class="list-bullet1"> <li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo b"><b>Documentation</b></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> improvements especially regarding <a href="https://pip.pypa.io/en/latest/development/architecture/">pip internals and architecture</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> </span></li> </ul> </div> <div class="ace-line" id="magicdomid28" spellcheck="true"> <h2> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">Next steps</span></h2> </div> <div class="ace-line" id="magicdomid30" spellcheck="true"> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo b"><b>Phase III</b></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> <a href="https://github.com/python/request-for/blob/master/2020-pip/RFP.md#june-december-2020-maintenance-and-sustainability-phase-iii">development work commences next month</a>.</span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> We will continue to improve the pip dependency resolver in response to testers' feedback. This will help us prepare to release pip 20.3, with the new resolver on by default, in October. We'll also review and respond to code contributions and new issues, to keep up with the pip code and issue review queue, help new contributors develop into continuing contributors, and help existing contributors grow into co-maintainers.</span></div> <div class="ace-line" id="magicdomid31" spellcheck="true"> <br /></div> <div class="ace-line" id="magicdomid32" spellcheck="true"> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">And <a href="https://wiki.python.org/psf/Pip2020DonorFundedRoadmap#Phase_III_.28Maintenance_and_Sustainability_work.2C_June-December_2020.29">our user experience work will also enter</a></span><a href="https://wiki.python.org/psf/Pip2020DonorFundedRoadmap#Phase_III_.28Maintenance_and_Sustainability_work.2C_June-December_2020.29"><span class="author-a-z73zgetx1z90zmorz71z06z86zjo url"></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> </span></a><span class="author-a-z73zgetx1z90zmorz71z06z86zjo b"><b><a href="https://wiki.python.org/psf/Pip2020DonorFundedRoadmap#Phase_III_.28Maintenance_and_Sustainability_work.2C_June-December_2020.29">Phase III</a>,</b></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> deepening and expanding foundational research in Python packaging. <a href="http://www.ei8fdb.org/thoughts/2020/03/pip-ux-study-recruitment/">We will</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"> recruit more users for interviews and surveys, develop user journey maps &amp; workflows, work with maintainers to write documentation and help messages, develop templates for UI bugs, commands, error messages, output, documentation, and configuration files, and teach pip maintainers UX practices.</span></div> <div class="ace-line" id="magicdomid34" spellcheck="true"> <h2> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">For more info or to contribute:</span></h2> </div> <div class="ace-line" id="magicdomid36" spellcheck="true"> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">We run this project as transparently as possible, so you can:</span></div> <div class="ace-line" id="magicdomid37" spellcheck="true"> <ul> <li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">&nbsp;read and participate in <a href="https://github.com/pypa/pip/projects/6">GitHub issues</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo url"></span></li> </ul> </div> <div class="ace-line" id="magicdomid38" spellcheck="true"> <ul> <li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">contact us in the <a href="https://discuss.python.org/t/an-update-on-pip-and-dependency-resolution/1898">Discourse</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo"><a href="https://discuss.python.org/t/an-update-on-pip-and-dependency-resolution/1898"> forum</a> or <a href="https://python.zulipchat.com/#narrow/stream/218659-pip-development">Zulip chat</a></span><span class="author-a-z73zgetx1z90zmorz71z06z86zjo url"></span></li> </ul> </div> <div class="ace-line" id="magicdomid39" spellcheck="true"> <ul> <li><span class="author-a-z73zgetx1z90zmorz71z06z86zjo">read <a href="https://wiki.python.org/psf/PackagingWG#Dependency_resolver_and_user_experience_improvements_for_pip">our meeting notes</a></span></li> </ul> </div> <div class="ace-line" id="magicdomid41" spellcheck="true"> <h2> <span class="author-a-z73zgetx1z90zmorz71z06z86zjo">Thank you</span></h2> </div> <div class="ace-line" id="magicdomid43" spellcheck="true"> <span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">Thanks to our contractors on this project: Nicole Harris, Bernard Tyers, and Georgia Bullen of Simply Secure; Pradyun Gedam; Ilan Schnell; Paul F. Moore of Atos; Tzu-ping Chung; Sumana Harihareswara of Changeset Consulting.</span></div> <div class="ace-line" id="magicdomid43" spellcheck="true"> </div> <div class="ace-line" id="magicdomid43" spellcheck="true"> <span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">This award continues our relationship with Mozilla, which supported Python packaging tools with <a href="https://pyfound.blogspot.com/2017/11/the-psf-awarded-moss-grant-pypi.html">a Mozilla Open Source Support Award in 2017 for Warehouse</a></span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n url"></span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">. Thank you, Mozilla! (MOSS has a number of types of awards, which are open to different sorts of open source/free software projects. If your project is looking for financial support, do check <a href="https://www.mozilla.org/en-US/moss/">the MOSS website</a></span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n url"></span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n"> to see if you qualify.)</span></div> <div class="ace-line" id="magicdomid44" spellcheck="true"> <br /></div> <div class="ace-line" id="magicdomid45" spellcheck="true"> <span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">This is new funding from the Chan Zuckerberg Initiative. This project is being made possible in part by a grant from the Chan Zuckerberg Initiative DAF, an advised fund of Silicon Valley Community Foundation. Thank you, CZI! (If your free software/open source project is used by biology researchers, check <a href="https://chanzuckerberg.com/rfa/essential-open-source-software-for-science/">the Essential Open Source Software for Science Request for Applications</a></span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n url"></span><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n"> and consider applying for the next round).</span></div> <div class="ace-line" id="magicdomid46" spellcheck="true"> <br /></div> <div class="ace-line" id="magicdomid47" spellcheck="true"> <span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n">Thank you to the pip and <a href="https://www.pypa.io/"><span id="goog_679598594"></span>PyPA</a></span><a href="https://www.blogger.com/"><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n url"></span></a><span class="author-a-dz88zh4z68zs2z77zby2z82zoz71z6n"><span id="goog_679598595"></span> maintainers, to the PSF and the Packaging WG, and to all the contributors and volunteers who work on or use Python packaging tools.</span></div> <div class="ace-line" id="magicdomid48" spellcheck="true"> <br /></div> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/08002085909817689325' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/08002085909817689325' rel='author' title='author profile'> <span itemprop='name'>Sumana Harihareswara</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/07/pip-team-midyear-report.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/07/pip-team-midyear-report.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-07-13T18:23:00-04:00'>7/13/2020 06:23:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-1436657185'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=6298634573721150667&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> Labels: <a href='https://pyfound.blogspot.com/search/label/grant' rel='tag'>grant</a>, <a href='https://pyfound.blogspot.com/search/label/grants' rel='tag'>grants</a>, <a href='https://pyfound.blogspot.com/search/label/open%20source' rel='tag'>open source</a>, <a href='https://pyfound.blogspot.com/search/label/pip' rel='tag'>pip</a> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Friday, April 03, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='8520' itemprop='blogId'/> <meta content='7465360087063452281' itemprop='postId'/> <a name='7465360087063452281'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/04/sponsoring-python-packaging.html'>Announcing a new Sponsorship Program for Python Packaging</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-7465360087063452281' itemprop='description articleBody'> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <span style="font-family: inherit;">The<span class="Apple-converted-space">&nbsp;</span><a href="https://wiki.python.org/psf/PackagingWG" style="color: #4183c4;">Packaging Working Group</a><span class="Apple-converted-space">&nbsp;</span>of the<span class="Apple-converted-space">&nbsp;</span><a href="https://python.org/psf-landing/" style="color: #4183c4;">Python Software Foundation</a><span class="Apple-converted-space">&nbsp;</span>is launching an all-new sponsorship program to sustain and improve Python's packaging ecosystem. Funds raised through this program will go directly towards improving the<span class="Apple-converted-space">&nbsp;</span><a href="https://packaging.python.org/key_projects/" style="color: #4183c4;">tools</a><span class="Apple-converted-space">&nbsp;</span>that your company uses every day and sustaining the continued operation of the<span class="Apple-converted-space">&nbsp;</span><a href="https://pypi.org/" style="color: #4183c4;">Python Package Index</a>.</span></div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <span style="font-family: inherit;">With this program we are asking companies that rely on Python, its ecosystem of packaging tools, and PyPI to help us build a dependable basis to continue our efforts.<span class="Apple-converted-space">&nbsp;</span></span></div> <h2 id="toc_1" style="-webkit-font-smoothing: antialiased; -webkit-print-color-adjust: exact; background-color: white; border-bottom: 1px solid rgb(204, 204, 204); cursor: text; font-size: 24px; margin: 20px 0px 10px; padding: 0px; position: relative; text-size-adjust: auto;"> <span style="font-family: inherit;">Improving the packaging ecosystem</span></h2> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <span style="font-family: inherit;">Since 2017, the Packaging Working Group has secured<span class="Apple-converted-space">&nbsp;</span><a href="https://pyfound.blogspot.com/2017/11/the-psf-awarded-moss-grant-pypi.html" style="color: #4183c4;">multiple</a><span class="Apple-converted-space">&nbsp;</span><a href="https://pyfound.blogspot.com/2019/12/moss-czi-support-pip.html" style="color: #4183c4;">grants</a>,<span class="Apple-converted-space">&nbsp;</span><a href="https://www.opentech.fund/results/supported-projects/pypi-improvements/" style="color: #4183c4;">completed one contract</a>, and received a<span class="Apple-converted-space">&nbsp;</span><a href="https://pyfound.blogspot.com/2020/03/an-update-pypi-funded-work.html" style="color: #4183c4;">generous gift</a><span class="Apple-converted-space">&nbsp;</span>-- all with the goal of improving the Python packaging ecosystem for all users. Most of these projects were funded by not-for-profit organizations and all of them were one-time awards with specific objectives.</span></div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <span style="font-family: inherit;">Results from these funded projects include:</span></div> <ul style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-size: 14px; margin: 15px 0px; padding-left: 30px; text-size-adjust: auto;"> <li style="-webkit-print-color-adjust: exact; margin: 0px;"><span style="font-family: inherit;">The successful relaunch of the Python Package Index, powered by the new 'Warehouse' codebase in 2018</span></li> <li style="-webkit-print-color-adjust: exact; margin: 0px;"><span style="font-family: inherit;">Adding security features to PyPI, including two-factor authentication in 2019</span></li> <li style="-webkit-print-color-adjust: exact; margin: 0px;"><span style="font-family: inherit;">Improving PyPI's web interface for users with disabilities and adding support for multiple locales in 2019</span></li> <li style="-webkit-print-color-adjust: exact; margin: 0px;"><span style="font-family: inherit;">Additional security-focused features for PyPI in 2019 and 2020</span></li> <li style="-webkit-print-color-adjust: exact; margin: 0px;"><span style="font-family: inherit;">Overhauling pip's user experience and dependency resolver in 2020</span></li> </ul> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <span style="font-family: inherit;">Companies have asked us how they can help fund the platform they depend on. With this new sponsorship program, the Working Group can sustainably<span class="Apple-converted-space">&nbsp;</span><a href="https://wiki.python.org/psf/Fundable%20Packaging%20Improvements" style="color: #4183c4;">fund packaging improvements</a><span class="Apple-converted-space">&nbsp;</span>not directed by a specific grant or contract and benefit millions of Python users around the world. Greater budget flexibility and a deeper reserve will help us invest in what the community needs.</span></div> <h2 id="toc_2" style="-webkit-font-smoothing: antialiased; -webkit-print-color-adjust: exact; background-color: white; border-bottom: 1px solid rgb(204, 204, 204); cursor: text; font-size: 24px; margin: 20px 0px 10px; padding: 0px; position: relative; text-size-adjust: auto;"> <span style="font-family: inherit;">Sustaining PyPI</span></h2> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <span style="font-family: inherit;">As of April 2020, the<span class="Apple-converted-space">&nbsp;</span><a href="https://pypi.org/" style="color: #4183c4;">Python Package Index</a><span class="Apple-converted-space">&nbsp;</span>responds to 800 million requests and delivers 200 million packages totalling 400 terabytes, during the typical day. Our users include hobbyists, scientists, companies, students, governments, nonprofits, and more.</span></div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <span style="font-family: inherit;"><a href="https://pypi.org/sponsors/" style="color: #4183c4;">Existing sponsors</a><span class="Apple-converted-space">&nbsp;</span>donate their services, which keeps PyPI free to users and to the PSF, aside from a subset of one staff member's time. Without these donations, the costs to operate PyPI each month would be staggering.</span></div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <span style="font-family: inherit;">These critical service donations must not be taken for granted. Sponsoring the Packaging Working Group through this new program creates and maintains a stable reserve. We'll need that reserve in the event that we lose any of these in-kind service donations and must pay some or all of PyPI's operating costs.</span></div> <h2 id="toc_3" style="-webkit-font-smoothing: antialiased; -webkit-print-color-adjust: exact; background-color: white; border-bottom: 1px solid rgb(204, 204, 204); cursor: text; font-size: 24px; margin: 20px 0px 10px; padding: 0px; position: relative; text-size-adjust: auto;"> <span style="font-family: inherit;">Show your support!</span></h2> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-size: 14px; margin-bottom: 15px; margin-top: 15px; text-size-adjust: auto;"> <span style="font-family: inherit;">As a company, your team can review the details of this new sponsorship program in our<span class="Apple-converted-space">&nbsp;</span><a href="https://pypi.org/sponsor" style="color: #4183c4;">prospectus</a>. Should you have any questions you can contact us at <a href="mailto:sponsorship@pypi.org">sponsorship@pypi.org</a>. When you're ready,<span class="Apple-converted-space">&nbsp;</span><a href="https://docs.google.com/forms/d/e/1FAIpQLSe3pvmpCYLTPB-V_9hpT6vrarm9GE6Wko_fy_KhJKm7NFqF_Q/viewform" style="color: #4183c4;">apply here</a>. We are excited to hear from you!</span></div> <div style="-webkit-print-color-adjust: exact; background-color: white; caret-color: rgb(0, 0, 0); font-size: 14px; margin-top: 15px; text-size-adjust: auto;"> <span style="font-family: inherit;">If your company cannot donate: Even as an individual, your contributions count! No matter the size or frequency, please support us if you are able at<span class="Apple-converted-space">&nbsp;</span><a href="https://donate.pypi.org/" style="color: #4183c4;">donate.pypi.org</a>.</span></div> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/13577459520968677064' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/13577459520968677064' rel='author' title='author profile'> <span itemprop='name'>Ee Durbin</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/04/sponsoring-python-packaging.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/04/sponsoring-python-packaging.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-04-03T11:41:00-04:00'>4/03/2020 11:41:00 AM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-312150102'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=7465360087063452281&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> Labels: <a href='https://pyfound.blogspot.com/search/label/packaging' rel='tag'>packaging</a>, <a href='https://pyfound.blogspot.com/search/label/pip' rel='tag'>pip</a>, <a href='https://pyfound.blogspot.com/search/label/pypi' rel='tag'>pypi</a>, <a href='https://pyfound.blogspot.com/search/label/setuptools' rel='tag'>setuptools</a>, <a href='https://pyfound.blogspot.com/search/label/sponso' rel='tag'>sponso</a> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Monday, March 23, 2020</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='8520' itemprop='blogId'/> <meta content='3759943304329466354' itemprop='postId'/> <a name='3759943304329466354'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html'>New pip resolver to roll out this year</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-3759943304329466354' itemprop='description articleBody'> <p>The developers of pip are in the process of developing a new resolver for pip (as <a href="https://pyfound.blogspot.com/2019/12/moss-czi-support-pip.html">we announced on the PSF blog</a> last year). We aim to roll it out later this year. (<i>Updated 29 September</i> to add: <a href="https://pip.pypa.io/en/latest/user_guide/#resolver-changes-2020">see our migration guide</a>.) As part of that work, there will be some major changes to how pip determines what to install, based on package requirements. In this post we share:</p><p><b><a href="#what-will-change">What will change</a></b><br /> <b><a href="#what-you-can-do-to-help">What you can do to help</a></b><br /> <b><a href="#when-this-will-be-happening">When this will be happening</a></b></p><p>To understand what pip does and why we&#8217;re working on it, please read <a href="https://pyfound.blogspot.com/2019/12/moss-czi-support-pip.html">our earlier overview post</a>.</p><h2 id="what-will-change">What will change</h2><p>The most significant changes to the resolver will be:</p><ul><li>It will <b>reduce inconsistency</b>: it will <i>no longer install a combination of packages that is mutually inconsistent</i>. At the moment, it is possible for pip to install a package which does not satisfy the declared requirements of another installed package. For example, right now, <code>pip install "six&lt;1.12" "virtualenv==20.0.2"</code> does the wrong thing, &#8220;successfully&#8221; installing <code>six==1.11</code>, even though <code>virtualenv==20.0.2</code> requires <code>six&gt;=1.12.0,&lt;2</code> (<a href="https://github.com/pypa/virtualenv/blob/20.0.2/setup.cfg#L42-L50">defined here</a>). The new resolver would, instead, outright reject installing anything if it got that input.</li> <li>It will be <b>stricter</b> - if you ask pip to install two packages with incompatible requirements, it will refuse (rather than installing a broken combination, like it does now).</li> </ul><p>Also, this is <b>a major change to a key part of pip</b> - it&#8217;s quite possible there will initially be bugs. We would like to make sure that those get caught <i>before</i> people start using the new version in production.</p><p>(For deep technical details, see <a href="https://github.com/pypa/pip/projects/5">this in-progress GitHub milestone</a>.)</p><h2 id="what-you-can-do-to-help">What you can do to help</h2><p>We recognize that everyone&#8217;s work is being disrupted by the COVID-19 pandemic, and that many data scientists and medical researchers use Python and pip in their work. We want to make the upgrade process as smooth and bug-free as possible for our users; if you can help us, you&#8217;ll be helping each other.</p><ol type="1"><li><p>First and most fundamentally, <a href="https://bit.ly/pip-ux-studies">please help us understand how you use pip by <b>talking with our user experience researchers</b></a>. You can do this right now! You can take a survey, or have a researcher interview you over a video call. <a href="https://bit.ly/pip-ux-studies">Please sign up and spread the word</a> to anyone who uses pip (even a little bit).</p></li> <li><p>Right now, even before we release the new resolver as a beta, you can help by <b>running <code>pip check</code> on your current environment</b>. This will report if you have any inconsistencies in your set of installed packages. Having a clean installation will make it much less likely that you will hit issues when the new resolver is released (and may address hidden problems in your current environment!). If you run <code>pip check</code> and run into stuff you can&#8217;t figure out, please <a href="https://pip.pypa.io/">ask for help in our issuetracker or chat</a>.</p></li> <li><p>Please make time to <b><i>test</i> the new version of pip, probably in May</b> (see below). While we have tried to make sure that pip&#8217;s test suite covers as many cases as we can, we are very aware that there are people using pip with many different workflows and build processes, and we will not be able to cover all of those without your help.</p><ul><li>If you use pip to install your software, try out the new resolver and let us know if it works for you.</li> <li>If you have a build pipeline that depends on pip installing your dependencies for you, check that the new resolver does what you need.</li> <li>Run your project&#8217;s CI (test suite, build process, etc.) using the new resolver, and let us know of any issues.</li> <li>If you have encountered resolver issues with pip in the past, check whether the new resolver fixes them. Also, let us know if the new resolver has issues with any workarounds you put in to address the current resolver&#8217;s limitations. We&#8217;ll need to ensure that people can transition off such workarounds smoothly.</li> </ul><p>As you and your colleagues plan for the next few months, please set aside time, ideally in May, to test the new resolver and <a href="https://tools.simplysecure.org/survey/index.php?r=survey/index&amp;sid=989272&amp;lang=en">tell us whether it breaks anything for your setup by filling out this survey</a>. If you maintain an open source project or use pip at your job, you can make a ticket now and put it in your backlog.</p></li> <li><p><b>Spread the word!</b> If you know of other people who rely on pip, who might not have seen this message, let them know. You can do this right now.</p></li> <li><p>And if you develop or support a tool that wraps pip or uses it to deliver part of your functionality, please make time to <b>test your integration with our beta in May</b>, and sure that the new resolver doesn&#8217;t cause you any issues. (It shouldn&#8217;t, as the resolver is an internal component of pip and shouldn&#8217;t be visible to people embedding pip, but we&#8217;d like to be sure of that.)</p></li> </ol><h2 id="when-this-will-be-happening">When this will be happening</h2><p>We intend to release the new resolver early in the second half of 2020. We will provide <b>alpha and beta releases</b> before that point as the work progresses (probably starting in <b>May</b>), and we&#8217;ll provide a GitHub issue tracker and an email address where you can report bugs. We would appreciate as much feedback as we can get on the betas when they become available.</p><p>(We were already working as a distributed team. The COVID-19 pandemic and related disruptions are affecting us &#8211; for instance, we were aiming to meet, work together, and test and discuss our work at PyCon US. But we still anticipate releasing the new resolver in the second half of 2020.)</p><p>To find out when the new beta is available for testing, and how to report problems, <b><a href="https://mail.python.org/mailman3/lists/pypi-announce.python.org/">subscribe to the pypi-announce mailing list</a></b>. It&#8217;s very low-traffic.</p><p>(Why now? The Python Software Foundation&#8217;s Packaging Working Group <a href="https://pyfound.blogspot.com/2019/12/moss-czi-support-pip.html">obtained funding for this work</a> because it&#8217;s sorely needed; <a href="https://wiki.python.org/psf/Fundable%20Packaging%20Improvements#Finish_dependency_resolver_for_pip">many other features and tools are blocked waiting for this fix</a>. We&#8217;ve spent years addressing technical debt in pip so we can properly untie this knot and refurbish the resolver. We started this chunk of donor-funded work on pip a few months ago and it&#8217;s now gotten far enough that we can make this pre-announcement.)</p><p>Thank you to the pip and PyPA maintainers, to the PSF and the Packaging WG, and to all the contributors and volunteers who work on or use Python packaging tools. And thank you to <a href="https://www.mozilla.org/en-US/moss/">Mozilla (through its Mozilla Open Source Support Awards)</a> and to <a href="https://chanzuckerberg.com/eoss/">the Chan Zuckerberg Initiative</a> DAF, an advised fund of Silicon Valley Community Foundation, for funding enabling this work!</p> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/08002085909817689325' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/08002085909817689325' rel='author' title='author profile'> <span itemprop='name'>Sumana Harihareswara</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2020-03-23T14:40:00-04:00'>3/23/2020 02:40:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-1436657185'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=3759943304329466354&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> Labels: <a href='https://pyfound.blogspot.com/search/label/grant' rel='tag'>grant</a>, <a href='https://pyfound.blogspot.com/search/label/grants' rel='tag'>grants</a>, <a href='https://pyfound.blogspot.com/search/label/open%20source' rel='tag'>open source</a>, <a href='https://pyfound.blogspot.com/search/label/pip' rel='tag'>pip</a>, <a href='https://pyfound.blogspot.com/search/label/volunteer' rel='tag'>volunteer</a> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> <div class="date-outer"> <h2 class='date-header'><span>Wednesday, December 04, 2019</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='https://lh5.googleusercontent.com/5h3X2IlLjvHn9uOlJ29nqh0aTW1PlxJ6zeMam-ivpPt-oV2NW6KolLPyc6JrKkN-HmBJ9BD0CWbiGxBzhqFJKchf9TCPTKQSUMxiQ_DFKEjLQmvmEme81IwXY1aSpMgxoh1SGxQ' itemprop='image_url'/> <meta content='8520' itemprop='blogId'/> <meta content='7158064099987968072' itemprop='postId'/> <a name='7158064099987968072'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='https://pyfound.blogspot.com/2019/12/moss-czi-support-pip.html'>Mozilla and Chan Zuckerberg Initiative to support pip</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-7158064099987968072' itemprop='description articleBody'> <br /> <div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"> </div> <br /> The Python Software Foundation is receiving $407,000 USD to support<a href="https://wiki.python.org/psf/Pip2020DonorFundedRoadmap"> work</a> on<a href="https://pip.pypa.io/"> pip</a> in 2020. Thank you to<a href="https://www.mozilla.org/en-US/moss/"> Mozilla (through its Mozilla Open Source Support Awards)</a> and to the<a href="https://chanzuckerberg.com/eoss/"> Chan Zuckerberg Initiative</a> for this funding! This foundational, transformational work will release Python developers and users to concentrate on the tools they're making and using, instead of troubleshooting dependency conflicts. Specifically, CZI and Mozilla are funding user experience, communications/publicity, and testing work (including developing robust testing infrastructure) as well as core feature development and review.<br /> <br /> <h3> <a href="https://lh5.googleusercontent.com/5h3X2IlLjvHn9uOlJ29nqh0aTW1PlxJ6zeMam-ivpPt-oV2NW6KolLPyc6JrKkN-HmBJ9BD0CWbiGxBzhqFJKchf9TCPTKQSUMxiQ_DFKEjLQmvmEme81IwXY1aSpMgxoh1SGxQ" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="161" src="https://lh5.googleusercontent.com/5h3X2IlLjvHn9uOlJ29nqh0aTW1PlxJ6zeMam-ivpPt-oV2NW6KolLPyc6JrKkN-HmBJ9BD0CWbiGxBzhqFJKchf9TCPTKQSUMxiQ_DFKEjLQmvmEme81IwXY1aSpMgxoh1SGxQ" width="320" /></a>&nbsp; </h3> <h3> <a href="https://lh5.googleusercontent.com/acZqPib5KOOQpNi8SCq4rU7vNCUQLgjD8-Fc3aw49IVF2MFQv0LZV2d9hb73H7mOCpqD3_OLDQ7f_d0NHohNzaWluGfwPVRivb5QXpHiZy4JPj3fuUrQQ23ipFnd3QZiUG9EBd0" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="89" src="https://lh5.googleusercontent.com/acZqPib5KOOQpNi8SCq4rU7vNCUQLgjD8-Fc3aw49IVF2MFQv0LZV2d9hb73H7mOCpqD3_OLDQ7f_d0NHohNzaWluGfwPVRivb5QXpHiZy4JPj3fuUrQQ23ipFnd3QZiUG9EBd0" width="320" /></a>What we're doing with the money</h3> Computers need to know the right order to install pieces of software ("to install <i>x</i>, you need to install <i>y</i> first"). So, when programmers share software, we have to precisely describe those installation prerequisites, and our installation tools need to navigate tricky situations where they're getting conflicting instructions. This project will make pip, a package installer for Python, better at handling that tricky logic, and easier for people to use and troubleshoot.<br /> <br /> Millions of people and organizations use tools written in Python, and nearly the entire ecosystem of Python software projects depends on pip. Our project will help everyone more easily install software, diagnose and fix problems, and maintain infrastructure.<br /> <br /> The Chan Zuckerberg Initiative funding is, in particular, aimed at improving <a href="https://chanzuckerberg.com/eoss/">Essential Open Source Software for Science</a>. Scientists use many tools written in Python --<a href="https://chanzuckerberg.com/newsroom/chan-zuckerberg-initiative-awards-5-million-for-open-source-software-projects-essential-to-science/"> many of CZI's awardees in this round are written in Python</a> -- but, also, researchers often want to write tools and share them with each other to help science advance faster. Our work will include research and improvements so the installation process will be easier to use and understand, which will enable researchers to build better applications and compose complex toolchains more easily.<br /> <br /> We've laid out a detailed three-phase work plan on<a href="https://wiki.python.org/psf/Pip2020DonorFundedRoadmap"> our pip 2020 Donor-funded Roadmap wiki page</a>. To summarize:<br /> <br /> <ul> <li><b>Mozilla</b> is awarding PSF a<a href="https://mozilla.org/moss"> Mozilla Open Source Support Award</a> (<a href="https://www.mozilla.org/en-US/moss/foundational-technology/">Track I: Foundational Technology</a>) for $207,000, which is paying for 5 months of: </li> <ul> <li><b>Python development work</b>: Reviewing and responding to open issues and pull requests, refactoring build logic, collaborating with downstream projects and users about config flags and transition schedules, working on the dependency resolver itself and fixing bugs. </li> </ul> <ul> <li><b>Initial user experience research and design work</b>: Reading existing bug reports and posts about Python package management confusion, interviewing users and running user tests, developing user journey maps and workflows, and working with maintainers to write documentation and help messages and to design resolver user experience. </li> </ul> <li><b>CZI</b> is giving PSF an<a href="https://chanzuckerberg.com/eoss/"> Essential Open Source Software for Science</a> grant for $200,000, which is paying for: </li> <ul> <li>12 months of <b>Python development, test infrastructure, and project maintenance</b>: Triaging bugs and reviewing pull requests, writing test cases, testing lead developers' work, building test infrastructure, investigating and fixing bugs, and writing the raw material for documentation to help future maintainers onboard better. </li> </ul> <ul> <li>4 months of <b>Phase III user experience research and design work</b>: Training maintainers in UX design, doing further user tests on the new pip, developing a checklist for developing new features, and making templates for commands, error messages, output, documentation, and config files. </li> <li><b>Travel</b> for initial developer onboarding and for some contributors to attend<a href="https://us.pycon.org/2020/"> PyCon North America</a>. </li> </ul> <li>And both CZI and Mozilla are paying for <b>project management</b> (planning, testing, editing, coordinating, communicating with stakeholders, announcing, reporting to funders, and getting obstacles out of everyone's way) and <b>PSF administrative work</b> (recruiting and overseeing contractors, project oversight, and financial processing). </li> </ul> The Packaging Working Group is<a href="https://github.com/python/request-for/blob/master/2020-pip/RFP.md"> currently selecting contractors for the programming parts of this work</a>. The other two contractors have already been selected:<br /> <ul> <li><i><a href="https://simplysecure.org/">Simply Secure</a></i> is "an educational nonprofit 501(c)3 that supports practitioners in designing ethically-informed, values-driven technology that protects human rights." As experts in open source user experience, Simply Secure will bring UX research and design skills to the command-line experience of Python package management. </li> <li><i><a href="https://changeset.nyc/">Changeset Consulting, LLC</a></i>, providing project management, is a returning contractor, having previously worked on<a href="http://pyfound.blogspot.com/2017/11/the-psf-awarded-moss-grant-pypi.html"> the PyPI rewrite launch</a> and<a href="https://pyfound.blogspot.com/2019/03/commencing-security-accessibility-and.html"> improvements to PyPI's accessibility, security, and internationalization</a>. Changeset lead Sumana Harihareswara was also the lead grantwriter for these funding proposals. </li> </ul> <h3> &nbsp;</h3> <h3> Why this and why now?</h3> We're partway through a next-generation rewrite of pip's dependency resolver. The project ran into massive technical debt, but the refactoring is nearly finished and prototype functionality is in alpha now.<br /> <br /> We need to finish the resolver<a href="https://wiki.python.org/psf/Fundable%20Packaging%20Improvements#Finish_dependency_resolver_for_pip"> because many other packaging improvements are blocked on it, it'll fix many dependency issues for Python users, and it'll fix installation problems for conda, certbot, WebSocket, and many other projects</a>. And we need to improve pip's UX<a href="https://wiki.python.org/psf/Fundable%20Packaging%20Improvements#Improve_pip_user_experience"> by providing better error messages and prompts, logs, output, and reporting, consistently across features, to fit users' mental models better, make hairy problems easier to untangle, and reduce unintended data loss</a>.<br /> <br /> The<a href="https://wiki.python.org/psf/PackagingWG"> Packaging Working Group</a> looks for<a href="https://wiki.python.org/psf/Fundable%20Packaging%20Improvements"> potential improvements in Python packaging and distribution that are well-scoped, have community consensus, and could be expedited through funding</a>. In the past three years, the Packaging WG has received funding for<a href="https://wiki.python.org/psf/PackagingWG#Past%20projects"> several improvements to PyPI</a> -- $170,000 from Mozilla, $80,000 from OTF, and $100,000 from Facebook -- and is seeking to help other packaging tools. In June,<a href="https://github.com/pypa/pip/issues/6536"> pip maintainers and Packaging Working Group members discussed the importance and difficulty of rolling out the new resolver</a>. We worked together to write and submit proposals to Mozilla and the Chan Zuckerberg Initiative.<br /> <h3> &nbsp;</h3> <h3> What's next?</h3> This work will start by early January 2020. Day-to-day work will mostly happen in<a href="https://github.com/pypa/pip/"> pip's GitHub repository</a> and<a href="https://python.zulipchat.com/"> the Python developers' Zulip livechat</a>. You can check for regular reports at<a href="https://blog.python.org/"> the Python Insider blog</a> and<a href="https://discuss.python.org/c/packaging"> the Packaging category of Python's Discourse developer forum</a>, archived at<a href="https://wiki.python.org/psf/PackagingWG"> the Packaging WG's wiki page</a>. And we'll publicize calls for volunteers, especially for user interviews and tests, on this blog, on<a href="https://www.python.org/community/lists/"> community mailing lists</a>, and on<a href="https://twitter.com/ThePSF"> Twitter</a>.<br /> <br /> The Packaging WG will continue to seek funding for<a href="https://wiki.python.org/psf/Fundable%20Packaging%20Improvements#Packaging_improvements_that_could_be_funded"> future improvements in pip, manylinux, setuptools, the Python Packaging User Guide, PyPI, etc.</a><br /> <h3> &nbsp;</h3> <h3> Thanks</h3> This award continues our relationship with Mozilla, which supported Python packaging tools with<a href="https://pyfound.blogspot.com/2017/11/the-psf-awarded-moss-grant-pypi.html"> a Mozilla Open Source Support Award in 2017 for Warehouse</a>. Thank you, Mozilla! (MOSS has a number of types of awards, which are open to different sorts of open source/free software projects. If your project is looking for financial support, do check<a href="https://mozilla.org/moss"> the MOSS website</a> to see if you qualify.)<br /> <br /> This is new funding from the Chan Zuckerberg Initiative. This project is being made possible in part by a grant from the Chan Zuckerberg Initiative DAF, an advised fund of Silicon Valley Community Foundation. Thank you, CZI! (If your free software/open source project is used by biology researchers, check<a href="https://chanzuckerberg.com/rfa/essential-open-source-software-for-science/"> the Essential Open Source Software for Science Request for Applications</a> and consider applying for the next round).<br /> <br /> Thank you to the pip and <a href="https://www.pypa.io/">PyPA</a> maintainers, to the PSF and the Packaging WG, and to all the contributors and volunteers who work on or use Python packaging tools.<br /> <br /> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'> <span class='post-author vcard'> Posted by <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://www.blogger.com/profile/08002085909817689325' itemprop='url'/> <a class='g-profile' href='https://www.blogger.com/profile/08002085909817689325' rel='author' title='author profile'> <span itemprop='name'>Sumana Harihareswara</span> </a> </span> </span> <span class='post-timestamp'> at <meta content='https://pyfound.blogspot.com/2019/12/moss-czi-support-pip.html' itemprop='url'/> <a class='timestamp-link' href='https://pyfound.blogspot.com/2019/12/moss-czi-support-pip.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2019-12-04T15:53:00-05:00'>12/04/2019 03:53:00 PM</abbr></a> </span> <span class='post-comment-link'> </span> <span class='post-icons'> <span class='item-control blog-admin pid-1436657185'> <a href='https://www.blogger.com/post-edit.g?blogID=8520&postID=7158064099987968072&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <div class='post-share-buttons goog-inline-block'> </div> </div> <div class='post-footer-line post-footer-line-2'> <span class='post-labels'> Labels: <a href='https://pyfound.blogspot.com/search/label/grant' rel='tag'>grant</a>, <a href='https://pyfound.blogspot.com/search/label/grants' rel='tag'>grants</a>, <a href='https://pyfound.blogspot.com/search/label/open%20source' rel='tag'>open source</a>, <a href='https://pyfound.blogspot.com/search/label/pip' rel='tag'>pip</a> </span> </div> <div class='post-footer-line post-footer-line-3'> <span class='post-location'> </span> </div> </div> </div> </div> </div></div> </div> <div class='blog-pager' id='blog-pager'> <span id='blog-pager-older-link'> <a class='blog-pager-older-link' href='https://pyfound.blogspot.com/search/label/pip?updated-max=2019-12-04T15:53:00-05:00&amp;max-results=20&amp;start=20&amp;by-date=false' id='Blog1_blog-pager-older-link' title='Older Posts'>Older Posts</a> </span> <a class='home-link' href='https://pyfound.blogspot.com/'>Home</a> </div> <div class='clear'></div> <div class='blog-feeds'> <div class='feed-links'> Subscribe to: <a class='feed-link' href='https://pyfound.blogspot.com/feeds/posts/default' target='_blank' type='application/atom+xml'>Posts (Atom)</a> </div> </div> </div></div> </div> </div> <div class='column-left-outer'> <div class='column-left-inner'> <aside> </aside> </div> </div> <div class='column-right-outer'> <div class='column-right-inner'> <aside> <div class='sidebar section' id='sidebar-right-1'><div class='widget Text' data-version='1' id='Text1'> <h2 class='title'>Mission</h2> <div class='widget-content'> <span style="font-size: 125%;font-size:125%;"><i>The mission of the <a href="https://www.python.org/psf/">Python Software Foundation</a> is to promote, protect, and advance the Python programming language, and to support and facilitate the growth of a diverse and international community of Python programmers.</i></span> </div> <div class='clear'></div> </div><div class='widget LinkList' data-version='1' id='LinkList1'> <div class='widget-content'> <ul> <li><a href='https://www.python.org/psf-landing/'>Python Software Foundation</a></li> <li><a href='https://www.python.org/psf/grants/'>Grants Program</a></li> <li><a href='https://www.python.org/psf/membership/'>Membership</a></li> <li><a href='https://www.python.org/community/awards/'>Awards</a></li> <li><a href='https://www.python.org/psf/records/board/minutes/'>Meeting Minutes</a></li> </ul> <div class='clear'></div> </div> </div><div class='widget Image' data-version='1' id='Image1'> <h2>PSF Sponsors</h2> <div class='widget-content'> <a href='https://www.python.org/psf/sponsors/'> <img alt='PSF Sponsors' height='113' id='Image1_img' src='https://blogger.googleusercontent.com/img/a/AVvXsEinkl3WkxN3nTJap16aR2WhbP1k4BJw92phSFrhsrCWHOWl2raf6mjtgC7pt4NxSkiugearJ82UJRuepNqcZCEnB2Adm9c1EEv32nHzQf79hx-B2ZOqdk_M6Y6sWkGD7SMsq5l1ZE1xYyxGwrz5U1wnBHlqDOlDfiWHNtFwc_69mS7pRTH6=s250' width='250'/> </a> <br/> <span class='caption'>A big thank you to the above PSF sponsors for supporting our mission!</span> </div> <div class='clear'></div> </div><div class='widget HTML' data-version='1' id='HTML1'> <div class='widget-content'> <a class="twitter-timeline" data-width="256" data-height="512" data-dnt="true" href="https://twitter.com/ThePSF?ref_src=twsrc%5Etfw">Tweets by ThePSF</a> <script async="async" src="https://platform.twitter.com/widgets.js" charset="utf-8" ></script> </div> <div class='clear'></div> </div><div class='widget BlogArchive' data-version='1' id='BlogArchive1'> <h2>Blog Archive</h2> <div class='widget-content'> <div id='ArchiveList'> <div id='BlogArchive1_ArchiveList'> <ul class='hierarchy'> <li class='archivedate expanded'> <a class='toggle' href='javascript:void(0)'> <span class='zippy toggle-open'> &#9660;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2025/'> 2025 </a> <span class='post-count' dir='ltr'>(2)</span> <ul class='hierarchy'> <li class='archivedate expanded'> <a class='toggle' href='javascript:void(0)'> <span class='zippy toggle-open'> &#9660;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2025/02/'> February </a> <span class='post-count' dir='ltr'>(1)</span> <ul class='posts'> <li><a href='https://pyfound.blogspot.com/2025/02/where-is-psf-2025-edition.html'>Where is the PSF? 2025 Edition</a></li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2025/01/'> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/'> 2024 </a> <span class='post-count' dir='ltr'>(58)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/12/'> December </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/11/'> November </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/08/'> August </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/07/'> July </a> <span class='post-count' dir='ltr'>(7)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/06/'> June </a> <span class='post-count' dir='ltr'>(16)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/05/'> May </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/04/'> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/02/'> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2024/01/'> January </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/'> 2023 </a> <span class='post-count' dir='ltr'>(37)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/12/'> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/11/'> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/08/'> August </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/06/'> June </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/05/'> May </a> <span class='post-count' dir='ltr'>(12)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/04/'> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/03/'> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/02/'> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2023/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/'> 2022 </a> <span class='post-count' dir='ltr'>(35)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/11/'> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/10/'> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/07/'> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/06/'> June </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/05/'> May </a> <span class='post-count' dir='ltr'>(12)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/04/'> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/03/'> March </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/02/'> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2022/01/'> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/'> 2021 </a> <span class='post-count' dir='ltr'>(42)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/11/'> November </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/07/'> July </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/06/'> June </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/05/'> May </a> <span class='post-count' dir='ltr'>(12)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/04/'> April </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/03/'> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/02/'> February </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2021/01/'> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/'> 2020 </a> <span class='post-count' dir='ltr'>(51)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/12/'> December </a> <span class='post-count' dir='ltr'>(8)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/11/'> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/09/'> September </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/07/'> July </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/06/'> June </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/05/'> May </a> <span class='post-count' dir='ltr'>(10)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/04/'> April </a> <span class='post-count' dir='ltr'>(11)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/03/'> March </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2020/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/'> 2019 </a> <span class='post-count' dir='ltr'>(45)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/11/'> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/09/'> September </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/08/'> August </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/07/'> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/06/'> June </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/05/'> May </a> <span class='post-count' dir='ltr'>(11)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/02/'> February </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2019/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/'> 2018 </a> <span class='post-count' dir='ltr'>(31)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/12/'> December </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/10/'> October </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/07/'> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/06/'> June </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/05/'> May </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/04/'> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/02/'> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2018/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/'> 2017 </a> <span class='post-count' dir='ltr'>(32)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/11/'> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/10/'> October </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/09/'> September </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/07/'> July </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/05/'> May </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/04/'> April </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/02/'> February </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2017/01/'> January </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/'> 2016 </a> <span class='post-count' dir='ltr'>(27)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/10/'> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/08/'> August </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/06/'> June </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/05/'> May </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/04/'> April </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2016/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/'> 2015 </a> <span class='post-count' dir='ltr'>(67)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/11/'> November </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/10/'> October </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/07/'> July </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/06/'> June </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/05/'> May </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/04/'> April </a> <span class='post-count' dir='ltr'>(13)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/03/'> March </a> <span class='post-count' dir='ltr'>(14)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/02/'> February </a> <span class='post-count' dir='ltr'>(9)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2015/01/'> January </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/'> 2014 </a> <span class='post-count' dir='ltr'>(14)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/10/'> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/05/'> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/02/'> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2014/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/'> 2013 </a> <span class='post-count' dir='ltr'>(18)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/06/'> June </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/03/'> March </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/02/'> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2013/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/'> 2012 </a> <span class='post-count' dir='ltr'>(21)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/11/'> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/10/'> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/06/'> June </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/05/'> May </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/03/'> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2012/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/'> 2011 </a> <span class='post-count' dir='ltr'>(55)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/12/'> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/10/'> October </a> <span class='post-count' dir='ltr'>(7)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/09/'> September </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/08/'> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/06/'> June </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/05/'> May </a> <span class='post-count' dir='ltr'>(8)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/04/'> April </a> <span class='post-count' dir='ltr'>(8)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/03/'> March </a> <span class='post-count' dir='ltr'>(13)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/02/'> February </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2011/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/'> 2010 </a> <span class='post-count' dir='ltr'>(35)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/12/'> December </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/10/'> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/09/'> September </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/07/'> July </a> <span class='post-count' dir='ltr'>(8)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/06/'> June </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/05/'> May </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/04/'> April </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2010/01/'> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/'> 2009 </a> <span class='post-count' dir='ltr'>(21)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/12/'> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/10/'> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/09/'> September </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/08/'> August </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/07/'> July </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/06/'> June </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/05/'> May </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2009/02/'> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/'> 2008 </a> <span class='post-count' dir='ltr'>(23)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/12/'> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/11/'> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/10/'> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/08/'> August </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/05/'> May </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/03/'> March </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/02/'> February </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2008/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/'> 2007 </a> <span class='post-count' dir='ltr'>(26)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/11/'> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/10/'> October </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/09/'> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/08/'> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/07/'> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/06/'> June </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/05/'> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/04/'> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/03/'> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/02/'> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2007/01/'> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/'> 2006 </a> <span class='post-count' dir='ltr'>(39)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/12/'> December </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/11/'> November </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/10/'> October </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/09/'> September </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/08/'> August </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/07/'> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/05/'> May </a> <span class='post-count' dir='ltr'>(7)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/04/'> April </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href='https://pyfound.blogspot.com/2006/03/'> March </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> </div> </div> <div class='clear'></div> </div> </div></div> <table border='0' cellpadding='0' cellspacing='0' class='section-columns columns-2'> <tbody> <tr> <td class='first columns-cell'> <div class='sidebar no-items section' id='sidebar-right-2-1'></div> </td> <td class='columns-cell'> <div class='sidebar no-items section' id='sidebar-right-2-2'></div> </td> </tr> </tbody> </table> <div class='sidebar no-items section' id='sidebar-right-3'></div> </aside> </div> </div> </div> <div style='clear: both'></div> <!-- columns --> </div> <!-- main --> </div> </div> <div class='main-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <footer> <div class='footer-outer'> <div class='footer-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left footer-fauxborder-left'> <div class='fauxborder-right footer-fauxborder-right'></div> <div class='region-inner footer-inner'> <div class='foot no-items section' id='footer-1'></div> <table border='0' cellpadding='0' cellspacing='0' class='section-columns columns-2'> <tbody> <tr> <td class='first columns-cell'> <div class='foot no-items section' id='footer-2-1'></div> </td> <td class='columns-cell'> <div class='foot no-items section' id='footer-2-2'></div> </td> </tr> </tbody> </table> <!-- outside of the include in order to lock Attribution widget --> <div class='foot section' id='footer-3' name='Footer'><div class='widget Attribution' data-version='1' id='Attribution1'> <div class='widget-content' style='text-align: center;'> Powered by <a href='https://www.blogger.com' target='_blank'>Blogger</a>. </div> <div class='clear'></div> </div></div> </div> </div> <div class='footer-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </footer> <!-- content --> </div> </div> <div class='content-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <script type='text/javascript'> window.setTimeout(function() { document.body.className = document.body.className.replace('loading', ''); }, 10); </script> <script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/2725212210-widgets.js"></script> <script type='text/javascript'> window['__wavt'] = 'AOuZoY5ex7YxIT4TolEnNIbU0ZnSXX4T3A:1740542283457';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d8520','//pyfound.blogspot.com/search/label/pip','8520'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '8520', 'title': 'Python Software Foundation News', 'url': 'https://pyfound.blogspot.com/search/label/pip', 'canonicalUrl': 'https://pyfound.blogspot.com/search/label/pip', 'homepageUrl': 'https://pyfound.blogspot.com/', 'searchUrl': 'https://pyfound.blogspot.com/search', 'canonicalHomepageUrl': 'https://pyfound.blogspot.com/', 'blogspotFaviconUrl': 'https://pyfound.blogspot.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': false, 'httpsEnabled': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'UA-55961911-3', 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': false, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Python Software Foundation News - Atom\x22 href\x3d\x22https://pyfound.blogspot.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Python Software Foundation News - RSS\x22 href\x3d\x22https://pyfound.blogspot.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Python Software Foundation News - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/8520/posts/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/f04e4d11442969dd', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Share to X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'index', 'searchLabel': 'pip', 'pageName': 'pip', 'pageTitle': 'Python Software Foundation News: pip'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Python Software Foundation News', 'description': '\xa0\xa0News from the Python Software Foundation', 'url': 'https://pyfound.blogspot.com/search/label/pip', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': false, 'isArchive': false, 'isSearch': true, 'isLabelSearch': true, 'search': {'label': 'pip', 'resultsMessage': 'Showing posts with the label pip', 'resultsMessageHtml': 'Showing posts with the label \x3cspan class\x3d\x27search-label\x27\x3epip\x3c/span\x3e'}}}]); _WidgetManager._RegisterWidget('_NavbarView', new _WidgetInfo('Navbar1', 'navbar', document.getElementById('Navbar1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'navMessage': 'Showing posts with label \x3cb\x3epip\x3c/b\x3e. \x3ca href\x3d\x22https://pyfound.blogspot.com/\x22\x3eShow all posts\x3c/a\x3e', 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/177302283-lbx.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/1964470060-lightbox_bundle.css'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_TextView', new _WidgetInfo('Text1', 'sidebar-right-1', document.getElementById('Text1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LinkListView', new _WidgetInfo('LinkList1', 'sidebar-right-1', document.getElementById('LinkList1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_ImageView', new _WidgetInfo('Image1', 'sidebar-right-1', document.getElementById('Image1'), {'resize': true}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML1', 'sidebar-right-1', document.getElementById('HTML1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar-right-1', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_AttributionView', new _WidgetInfo('Attribution1', 'footer-3', document.getElementById('Attribution1'), {}, 'displayModeFull')); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10