[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"sanity-KCOetdtg0nyYgDZAdEWdPWY1zD2StMvosCdy2ZB1XGM":3,"sanity-AsCfFz84ZdqGsrjOwHTjCeNjt9FFCnUzciT6WfMQ7uo":803},{"data":4,"sourceMap":-1},{"latestPodcast":5,"latestReleases":14,"post":39,"recent":778},[6],{"_id":7,"publishedAt":8,"slug":9,"sponsored":12,"title":13},"50f4509c-4f55-4f11-8adc-5556e821ea77","2026-06-30T07:40:00.000Z",{"_type":10,"current":11},"slug","why-intent-prediction-needs-more-than-an-llm",null,"Why intent prediction needs more than an LLM",[15,21,27,33],{"_id":16,"publishedAt":17,"slug":18,"title":20},"eb5b66eb-9410-4329-83bb-22bbff39402a","2026-04-28T13:00:00.000Z",{"_type":10,"current":19},"turn-scattered-knowledge-into-trusted-intelligence","Turning scattered knowledge into trusted intelligence: Stack Internal 2026.3",{"_id":22,"publishedAt":23,"slug":24,"title":26},"369c2401-b62e-4a37-8ff8-bf603023ecad","2026-03-02T15:03:00.988Z",{"_type":10,"current":25},"what-s-new-at-stack-overflow-march-2026","What’s new at Stack Overflow: March 2026",{"_id":28,"publishedAt":29,"slug":30,"title":32},"5e9053a4-07ea-447c-91ea-29e0b6228537","2026-02-02T15:00:00.000Z",{"_type":10,"current":31},"what-s-new-at-stack-overflow-february-2026","What’s new at Stack Overflow: February 2026",{"_id":34,"publishedAt":35,"slug":36,"title":38},"a1b538eb-a8a6-46d0-80a1-ac70ec9bb935","2026-01-05T10:00:00.000-05:00",{"_type":10,"current":37},"what-s-new-at-stack-overflow-january-2026","What’s new at Stack Overflow: January 2026",{"_createdAt":40,"_id":41,"_rev":42,"_type":43,"_updatedAt":44,"author":45,"body":61,"comments":743,"dateUrl":744,"excerpt":745,"image":746,"legacyBody":749,"product":12,"publishedAt":752,"slug":753,"sponsored":12,"tags":755,"title":777,"visible":743},"2023-05-25T09:39:12Z","wp-post-14185","9HpbCsT2tq0xwozQfkfxpj","blogPost","2023-07-13T14:55:26Z",[46],{"_createdAt":47,"_id":48,"_rev":49,"_type":50,"_updatedAt":51,"avatar":52,"employee":57,"name":58,"slug":59},"2023-05-23T16:27:18Z","wp-author-250","dgl3SCUzppW3U2LvCoP35A","blogAuthor","2023-06-20T15:05:08Z",{"_type":53,"asset":54},"image",{"_ref":55,"_type":56},"image-532bbba47019944bde56fd3aa1fc5439da76f525-1024x1024-jpg","reference","none","Vicki Boykis",{"current":60},"vboykis",[62,73,93,101,109,118,137,156,164,172,191,199,207,226,231,261,280,299,307,315,378,397,405,409,417,421,440,470,489,497,515,523,531,550,579,587,595,612,630,649,674,682,698,735],{"_key":63,"_type":64,"children":65,"markDefs":71,"style":72},"778d3ee4370c","block",[66],{"_key":67,"_type":68,"marks":69,"text":70},"778d3ee4370c0","span",[],"In Pycon in 2014, Guido van Rossum, the creator of Python and, at the time, the Benevolent Dictator For Life of the language, stood on stage in a shirt that had a large 2.8 written on it in block letters, with a big red no entry sign through it. “It’s time to move on to Python 3,” he said, telling the audience that they should start adopting the new version of the language into their workflows.\n",[],"normal",{"_key":74,"_type":64,"children":75,"markDefs":89,"style":72},"d127bed2804e",[76,80,85],{"_key":77,"_type":68,"marks":78,"text":79},"d127bed2804e0",[],"After many years of hard work towards that goal from the core committers, and surrounding community of libraries, Python 2 is finally at end of life. January 1, 2020, according to ",{"_key":81,"_type":68,"marks":82,"text":84},"d127bed2804e1",[83],"9e5fb1987c02","pythonclock.org",{"_key":86,"_type":68,"marks":87,"text":88},"d127bed2804e2",[],", is the drop-dead date for support of Python 2.\n",[90],{"_key":83,"_type":91,"href":92,"reference":12},"link","http://pythonclock.org",{"_key":94,"_type":64,"children":95,"markDefs":100,"style":72},"ac5afdc5077c",[96],{"_key":97,"_type":68,"marks":98,"text":99},"ac5afdc5077c0",[],"For some companies who have already made the change years ago, it won’t be an issue. However, there’s a whole range of companies who won’t be making the change anytime soon, for a number of reasons.\n",[],{"_key":102,"_type":64,"children":103,"markDefs":108,"style":72},"59ef817dac5b",[104],{"_key":105,"_type":68,"marks":106,"text":107},"59ef817dac5b0",[],"What does this change mean for companies heavily utilizing the language, particularly those who may not be ready to migrate? To understand the entire context of what’s going on, let’s take a stroll back through Python history.\n",[],{"_key":110,"_type":64,"children":111,"markDefs":116,"style":117},"51a49c82a0f2",[112],{"_key":113,"_type":68,"marks":114,"text":115},"51a49c82a0f20",[],"A brief history of Python",[],"h2",{"_key":119,"_type":64,"children":120,"markDefs":134,"style":72},"52447fcb8b09",[121,125,130],{"_key":122,"_type":68,"marks":123,"text":124},"52447fcb8b090",[],"The idea behind developing Python 3 was to implement a single big change that got rid of a legacy problem in Python: rendering all strings as Unicode behind the scenes. As Brett Cannon, one of the core developers of Python, ",{"_key":126,"_type":68,"marks":127,"text":129},"52447fcb8b091",[128],"0b76a43caf23","writes,",{"_key":131,"_type":68,"marks":132,"text":133},"52447fcb8b092",[],"\n",[135],{"_key":128,"_type":91,"href":136,"reference":12},"https://snarky.ca/why-python-3-exists/",{"_key":138,"_type":64,"children":139,"markDefs":153,"style":72},"296b36a88ef2",[140,144,149],{"_key":141,"_type":68,"marks":142,"text":143},"296b36a88ef20",[],"People sometimes forget how old Python is; Guido started coding Python in December 1989 and was first released as open source in February 1991. This means that Python itself predates the",{"_key":145,"_type":68,"marks":146,"text":148},"296b36a88ef21",[147],"11423b23cdce"," first volume of the Unicode standard which came out in October 1991",{"_key":150,"_type":68,"marks":151,"text":152},"296b36a88ef22",[],". Over the intervening years, languages created after Unicode standardized chose to base their implementation for strings on encodings that could support Unicode.",[154],{"_key":147,"_type":91,"href":155,"reference":12},"https://en.wikipedia.org/wiki/Unicode#History",{"_key":157,"_type":64,"children":158,"markDefs":163,"style":72},"002815ad200b",[159],{"_key":160,"_type":68,"marks":161,"text":162},"002815ad200b0",[],"….",[],{"_key":165,"_type":64,"children":166,"markDefs":171,"style":72},"51f5fec65a75",[167],{"_key":168,"_type":68,"marks":169,"text":170},"51f5fec65a750",[],"Supporting Unicode and text from any written language is important. Python is a language for the world, not just for those languages that support the Roman alphabet that ASCII covers. This is why Python 3 makes it \"Unicode or bust\" when it comes to text; it guarantees that all Python 3 code will support everyone in the world whether the developer who wrote the code explicitly meant for it to or not.\n",[],{"_key":173,"_type":64,"children":174,"markDefs":188,"style":72},"e38a8e02ff9c",[175,179,184],{"_key":176,"_type":68,"marks":177,"text":178},"e38a8e02ff9c0",[],"Unfortunately, the team assumed that everyone would make the big switchover immediately, and made Python 3 backwards incompatible, and set 2 as a maintenance branch. However, many people didn’t want to switch, because, as the",{"_key":180,"_type":68,"marks":181,"text":183},"e38a8e02ff9c1",[182],"f8601d0d17e7"," PEP for the improvement said",{"_key":185,"_type":68,"marks":186,"text":187},"e38a8e02ff9c2",[],", Python 3 was “a relatively mild improvement on Python 2.” Many people didn’t switch for what they perceived to be as mostly an inconvenience. At that time, the largest difference was changing of the print statement to Python function syntax, which broke a lot of code.\n",[189],{"_key":182,"_type":91,"href":190,"reference":12},"https://www.python.org/dev/peps/pep-3000/",{"_key":192,"_type":64,"children":193,"markDefs":198,"style":72},"061fdfab150a",[194],{"_key":195,"_type":68,"marks":196,"text":197},"061fdfab150a0",[],"As a result, Python 2 continued to be in active development. In 2019, though, Python 3 has finally (mostly) become the default version of the language for new Python development, and many companies and projects are using the top features of Python 3: f-strings, Path, type hints, asyncio, and, of course, Unicode rendering.\n",[],{"_key":200,"_type":64,"children":201,"markDefs":206,"style":117},"a4811b565586",[202],{"_key":203,"_type":68,"marks":204,"text":205},"a4811b5655860",[],"A slow adoption process",[],{"_key":208,"_type":64,"children":209,"markDefs":223,"style":72},"649609ed5613",[210,214,219],{"_key":211,"_type":68,"marks":212,"text":213},"649609ed56130",[],"It’s been a long road to get to Python 3 adoption since the new major version was announced all the way back in 2008. ",{"_key":215,"_type":68,"marks":216,"text":218},"649609ed56131",[217],"6ca0af5467f0","Dustin shows ",{"_key":220,"_type":68,"marks":221,"text":222},"649609ed56132",[],"just how long adoption has taken:\n",[224],{"_key":217,"_type":91,"href":225,"reference":12},"https://python-release-cycle.glitch.me/",{"_key":227,"_type":53,"alt":12,"asset":228,"caption":230,"markDefs":12},"f76ad4cddda2",{"_ref":229,"_type":56},"image-f6fd53f97f69d7164ab193d9410df581c4fb5aed-1600x737-png","",{"_key":232,"_type":64,"children":233,"markDefs":256,"style":72},"8a442027af95",[234,238,243,247,252],{"_key":235,"_type":68,"marks":236,"text":237},"8a442027af950",[],"At first, there were a lot of good reasons for not adopting Python 3: Most importantly, it wasn’t backwards compatible with Python 2. As a result, major libraries were hesitant to move to the platform, and in a self-fulfilling prophecy, and it was hard to port the code with a lack of supporting tools (eventually solved with things like ",{"_key":239,"_type":68,"marks":240,"text":242},"8a442027af951",[241],"fe66f8fdbe71","2to3",{"_key":244,"_type":68,"marks":245,"text":246},"8a442027af952",[]," and ",{"_key":248,"_type":68,"marks":249,"text":251},"8a442027af953",[250],"1ece957c1ef7","six",{"_key":253,"_type":68,"marks":254,"text":255},"8a442027af954",[],").\n",[257,259],{"_key":241,"_type":91,"href":258,"reference":12},"https://docs.python.org/2/library/2to3.html",{"_key":250,"_type":91,"href":260,"reference":12},"https://pypi.org/project/six/",{"_key":262,"_type":64,"children":263,"markDefs":277,"style":72},"3e9421cd11f8",[264,268,273],{"_key":265,"_type":68,"marks":266,"text":267},"3e9421cd11f80",[],"The tipping point for conversion occurred somewhere around 2016 or so with the ",{"_key":269,"_type":68,"marks":270,"text":272},"3e9421cd11f81",[271],"329c513f94ea","release of Python 3.5",{"_key":274,"_type":68,"marks":275,"text":276},"3e9421cd11f82",[],", which featured matrix multiplication, the introduction of asyncio, speed improvements to OrderedDict, and an implementation of type hints that brought some static language-like features to Python.\n",[278],{"_key":271,"_type":91,"href":279,"reference":12},"https://docs.python.org/3/whatsnew/3.5.html",{"_key":281,"_type":64,"children":282,"markDefs":296,"style":72},"1b98103c50be",[283,287,292],{"_key":284,"_type":68,"marks":285,"text":286},"1b98103c50be0",[],"Later versions include even more features, like the Pathlib library and f-string manipulation. With these changes, many libraries that people use (like ",{"_key":288,"_type":68,"marks":289,"text":291},"1b98103c50be1",[290],"34bc665ae817","scikit-learn",{"_key":293,"_type":68,"marks":294,"text":295},"1b98103c50be2",[]," for machine learning) started their migrations to Python 3.\n",[297],{"_key":290,"_type":91,"href":298,"reference":12},"https://pypi.org/project/scikit-learn/",{"_key":300,"_type":64,"children":301,"markDefs":306,"style":72},"8708644577e5",[302],{"_key":303,"_type":68,"marks":304,"text":305},"8708644577e50",[],"As more and more dependencies started upgrading, companies started moving, too.\n",[],{"_key":308,"_type":64,"children":309,"markDefs":314,"style":72},"85e07f10fb59",[310],{"_key":311,"_type":68,"marks":312,"text":313},"85e07f10fb590",[],"So now that we’re close to the end, what does the cutoff of Python 2 from development mean for the ecosystem of developers dependent on it?\n",[],{"_key":316,"_type":64,"children":317,"markDefs":367,"style":72},"2af91d1c7c3e",[318,322,327,331,336,340,345,349,354,358,363],{"_key":319,"_type":68,"marks":320,"text":321},"2af91d1c7c3e0",[],"Judging by the state of things on the internet, you’d have thought that everyone completed their migrations. In a survey from Jetbrains, who makes IDEs like IntelliJ and PyCharm, 75% of ",{"_key":323,"_type":68,"marks":324,"text":326},"2af91d1c7c3e1",[325],"beed2ee973dd","individual respondents",{"_key":328,"_type":68,"marks":329,"text":330},"2af91d1c7c3e2",[]," had indicated that they’ve already migrated. A flurry of blog posts have shown the same. For example, ",{"_key":332,"_type":68,"marks":333,"text":335},"2af91d1c7c3e3",[334],"118665d3fbd1","Dropbox detailed their migration",{"_key":337,"_type":68,"marks":338,"text":339},"2af91d1c7c3e4",[]," in the fall of 2018. Instagram ",{"_key":341,"_type":68,"marks":342,"text":344},"2af91d1c7c3e5",[343],"feed9ad9a159","migrated in 2017.",{"_key":346,"_type":68,"marks":347,"text":348},"2af91d1c7c3e6",[]," Facebook started in ",{"_key":350,"_type":68,"marks":351,"text":353},"2af91d1c7c3e7",[352],"8289dfb5014d","2014.",{"_key":355,"_type":68,"marks":356,"text":357},"2af91d1c7c3e8",[]," ",{"_key":359,"_type":68,"marks":360,"text":362},"2af91d1c7c3e9",[361],"2d0c3194e794","Splunk",{"_key":364,"_type":68,"marks":365,"text":366},"2af91d1c7c3e10",[],", at the urging of their customers, also did so recently.\n",[368,370,372,374,376],{"_key":325,"_type":91,"href":369,"reference":12},"https://www.jetbrains.com/research/devecosystem-2018/python/",{"_key":334,"_type":91,"href":371,"reference":12},"https://blogs.dropbox.com/tech/2018/09/how-we-rolled-out-one-of-the-largest-python-3-migrations-ever/",{"_key":343,"_type":91,"href":373,"reference":12},"https://thenewstack.io/instagram-makes-smooth-move-python-3/",{"_key":352,"_type":91,"href":375,"reference":12},"https://lwn.net/Articles/758159/",{"_key":361,"_type":91,"href":377,"reference":12},"https://www.splunk.com/blog/2019/07/01/admins-and-developers-we-re-transitioning-to-python-3.html",{"_key":379,"_type":64,"children":380,"markDefs":394,"style":72},"cc68580095ec",[381,385,390],{"_key":382,"_type":68,"marks":383,"text":384},"cc68580095ec0",[],"However, just because Python 2 is reaching end of life doesn’t mean companies will stop using it overnight. How do we know there’s still significant energy being invested into Python 2? We can check out what’s going on directly with PyPI, the Python package library. ",{"_key":386,"_type":68,"marks":387,"text":389},"cc68580095ec1",[388],"a9ef60413306","In 2016, the core developers behind PyPI started sending logs to Google’s BigQuery, for the ability to run SQL against them",{"_key":391,"_type":68,"marks":392,"text":393},"cc68580095ec2",[],", which makes it much easier to make architectural decisions based on usage.\n",[395],{"_key":388,"_type":91,"href":396,"reference":12},"https://langui.sh/2016/12/09/data-driven-decisions/",{"_key":398,"_type":64,"children":399,"markDefs":404,"style":72},"aaf8836b1013",[400],{"_key":401,"_type":68,"marks":402,"text":403},"aaf8836b10130",[],"For example, if you want to see which libraries have been downloaded, by Python version, over the last 30 days, you can create a new project in BigQuery (the first 1 TB queried per month is free), and run:\n",[],{"_key":406,"_type":407,"code":408,"markDefs":12},"b987541e1c78","code"," SELECT\n REGEXP_EXTRACT(details.python, r\"^([^\\.]+\\.[^\\.]+)\") as python_version,\n COUNT(*) as download_count,\nFROM\n TABLE_DATE_RANGE(\n  [the-psf:pypi.downloads],\n  DATE_ADD(CURRENT_TIMESTAMP(), -31, \"day\"),\n  DATE_ADD(CURRENT_TIMESTAMP(), -1, \"day\")\n )\nGROUP BY\n python_version,\nORDER BY\n download_count DESC\nLIMIT 100",{"_key":410,"_type":64,"children":411,"markDefs":416,"style":72},"02794735f523",[412],{"_key":413,"_type":68,"marks":414,"text":415},"02794735f5230",[],"Even though Python 3 has been the dominant version in the community for at least a year, the latest count of individual package downloads from PyPI shows that at least 40% of all packages for September of 2019 are 2.7 downloads. Granted, this is down from 60% at the beginning of the year, but is still significant given that EOL is only several months away.",[],{"_key":418,"_type":53,"alt":12,"asset":419,"caption":230,"markDefs":12},"d764c4e08a4a",{"_ref":420,"_type":56},"image-b4c6a251d907b2336afdc32e29afa1900ca4aa46-1502x666-png",{"_key":422,"_type":64,"children":423,"markDefs":437,"style":72},"9791290e88fa",[424,428,433],{"_key":425,"_type":68,"marks":426,"text":427},"9791290e88fa0",[],"On a per-library basis, ",{"_key":429,"_type":68,"marks":430,"text":432},"9791290e88fa1",[431],"860d3add0a30","it gets a little trickier",{"_key":434,"_type":68,"marks":435,"text":436},"9791290e88fa2",[],": Most Flask downloads are completed using the Python 3 version, but only 26% of botocore downloads (the AWS SDK for Python) are using Python 3.\n",[438],{"_key":431,"_type":91,"href":439,"reference":12},"https://www.ncsc.gov.uk/blog-post/time-to-shed-python-2",{"_key":441,"_type":64,"children":442,"markDefs":465,"style":72},"d93282d3206d",[443,447,452,456,461],{"_key":444,"_type":68,"marks":445,"text":446},"d93282d3206d0",[],"And, there are several libraries that are going to hold off with the migration: Twisted, ",{"_key":448,"_type":68,"marks":449,"text":451},"d93282d3206d1",[450],"dd362714ad81","a web framework",{"_key":453,"_type":68,"marks":454,"text":455},"d93282d3206d2",[],", which has only partially been ported, and ",{"_key":457,"_type":68,"marks":458,"text":460},"d93282d3206d3",[459],"09a38651bffb","PyPy,",{"_key":462,"_type":68,"marks":463,"text":464},"d93282d3206d4",[]," a frequently-used JIT compiler, which will keep version 2 around indefinitely.\n",[466,468],{"_key":450,"_type":91,"href":467,"reference":12},"https://twistedmatrix.com/documents/14.0.2/core/howto/python3.html",{"_key":459,"_type":91,"href":469,"reference":12},"https://www.infoworld.com/article/3194915/python-2-forever-3-projects-that-will-keep-python-2-alive.html",{"_key":471,"_type":64,"children":472,"markDefs":486,"style":72},"025d96511107",[473,477,482],{"_key":474,"_type":68,"marks":475,"text":476},"025d965111070",[],"End of life for any given piece of software usually doesn’t mean that software is no longer available. It does mean that it’s no longer updated against any security vulnerabilities or adding any further bug fixes. The Python",{"_key":478,"_type":68,"marks":479,"text":481},"025d965111071",[480],"21150006b5e0"," PEP regulating the end of life",{"_key":483,"_type":68,"marks":484,"text":485},"025d965111072",[]," (the language spec) specifies that,\n",[487],{"_key":480,"_type":91,"href":488,"reference":12},"https://www.python.org/dev/peps/pep-0373/",{"_key":490,"_type":64,"children":491,"markDefs":496,"style":72},"f2da63920e47",[492],{"_key":493,"_type":68,"marks":494,"text":495},"f2da63920e470",[],"This declaration does not guarantee that bugfix releases will be made on a regular basis, but it should enable volunteers who want to contribute bugfixes for Python 2.7 and it should satisfy vendors who still have to support Python 2 for years to come.\n",[],{"_key":498,"_type":64,"children":499,"markDefs":513,"style":72},"d80121106a63",[500,504,509],{"_key":501,"_type":68,"marks":502,"text":503},"d80121106a630",[],"But, there are a lot of risks with not updating to Python 3—most importantly, the risk of losing security updates, not taking advantage of new ",{"_key":505,"_type":68,"marks":506,"text":508},"d80121106a631",[507],"71b121be2e1b","features like type hints, and speed gains",{"_key":510,"_type":68,"marks":511,"text":512},"d80121106a632",[],".\n",[514],{"_key":507,"_type":91,"href":439,"reference":12},{"_key":516,"_type":64,"children":517,"markDefs":522,"style":117},"91a58c745da5",[518],{"_key":519,"_type":68,"marks":520,"text":521},"91a58c745da50",[],"Why the adoption rate is so slow",[],{"_key":524,"_type":64,"children":525,"markDefs":530,"style":72},"6a1b686a5d85",[526],{"_key":527,"_type":68,"marks":528,"text":529},"6a1b686a5d850",[],"So why aren’t we at a higher adoption rate this close to the deadline?\n",[],{"_key":532,"_type":64,"children":533,"markDefs":547,"style":72},"6cbfceb0508d",[534,538,543],{"_key":535,"_type":68,"marks":536,"text":537},"6cbfceb0508d0",[],"In a tongue-in-cheek post, I wrote that ",{"_key":539,"_type":68,"marks":540,"text":542},"6cbfceb0508d1",[541],"b7d345211a99","IT runs on Java 8.",{"_key":544,"_type":68,"marks":545,"text":546},"6cbfceb0508d2",[],"(which is ancient by today’s standards)\n",[548],{"_key":541,"_type":91,"href":549,"reference":12},"https://veekaybee.github.io/2019/05/10/java8/",{"_key":551,"_type":64,"children":552,"markDefs":574,"style":72},"b5b07d949c27",[553,557,562,566,571],{"_key":554,"_type":68,"marks":555,"text":556},"b5b07d949c270",[],"Java 8 is",{"_key":558,"_type":68,"marks":559,"text":561},"b5b07d949c271",[560],"d0f01941dbb6"," still the dominant development environment",{"_key":563,"_type":68,"marks":564,"text":565},"b5b07d949c272",[],", according to",{"_key":567,"_type":68,"marks":568,"text":570},"b5b07d949c273",[569],"4943d09fa688"," the JVM ecosystem report of 2018",{"_key":572,"_type":68,"marks":573,"text":512},"b5b07d949c274",[],[575,577],{"_key":560,"_type":91,"href":576,"reference":12},"https://www.stackchief.com/blog/Which%20Version%20of%20Java%20Should%20You%20Use%3F",{"_key":569,"_type":91,"href":578,"reference":12},"https://snyk.io/blog/jvm-ecosystem-report-2018/",{"_key":580,"_type":64,"children":581,"markDefs":586,"style":72},"8c81adc79d7a",[582],{"_key":583,"_type":68,"marks":584,"text":585},"8c81adc79d7a0",[],"This holds the answer: most large organizations, outside of the hype cycle of technical news posts, move much more slowly than the press or blogs would have you think. Most major banks are still running some variation of FORTRAN and COBOL under the covers, for example.\n",[],{"_key":588,"_type":64,"children":589,"markDefs":594,"style":72},"a2208f6c250b",[590],{"_key":591,"_type":68,"marks":592,"text":593},"a2208f6c250b0",[],"So while many companies are outlining their migration strategies, just the same or larger amount will stay on Python 2 for a long time. Why is this the case?\n",[],{"_key":596,"_type":64,"children":597,"markDefs":611,"style":72},"b448d70404bf",[598,602,607],{"_key":599,"_type":68,"marks":600,"text":601},"b448d70404bf0",[],"In reading the accounts of people who have already migrated, it’s easy to see: migrating codebases ",{"_key":603,"_type":68,"marks":604,"text":606},"b448d70404bf1",[605],"strong","takes a long time",{"_key":608,"_type":68,"marks":609,"text":610},"b448d70404bf2",[],", is a highly political decision, and experiences inertia, even in the companies that are the highest tech, with the best intentions.\n",[],{"_key":613,"_type":64,"children":614,"markDefs":628,"style":72},"2bc7cc72ed15",[615,619,624],{"_key":616,"_type":68,"marks":617,"text":618},"2bc7cc72ed150",[],"For example, in order to move to Python 3 at Facebook, ",{"_key":620,"_type":68,"marks":621,"text":623},"2bc7cc72ed151",[622],"a13f137f9037","Jason Fried",{"_key":625,"_type":68,"marks":626,"text":627},"2bc7cc72ed152",[]," started by rewriting a service in 2014. Along the way, he made a lot of mistakes, changed a lot of code, and did a lot of finagling to make it known that people were moving to Python 3 at Facebook by doing things like including himself in on new developer trainings. He then teamed up with Łukasz Langa, who had done the Instagram conversion to Python 3:\n",[629],{"_key":622,"_type":91,"href":375,"reference":12},{"_key":631,"_type":64,"children":632,"markDefs":646,"style":72},"26c5b616e169",[633,637,642],{"_key":634,"_type":68,"marks":635,"text":636},"26c5b616e1690",[],"In 2016, he and Langa formed a brand new team in Facebook to shepherd Python within the company, which they dubbed \"",{"_key":638,"_type":68,"marks":639,"text":641},"26c5b616e1691",[640],"fae28041e5b2","The Ministry of Silly Walks",{"_key":643,"_type":68,"marks":644,"text":645},"26c5b616e1692",[],".\" Because they were \"the Python team,\" the \"perceived authority\" he mentioned earlier worked; people assumed they could make decisions about Python at Facebook.\n",[647],{"_key":640,"_type":91,"href":648,"reference":12},"https://en.wikipedia.org/wiki/The_Ministry_of_Silly_Walks",{"_key":650,"_type":64,"children":651,"markDefs":670,"style":72},"78543e680a8e",[652,657,661,666],{"_key":653,"_type":68,"marks":654,"text":656},"78543e680a8e0",[655],"0ab0b556b8aa","Instagram’s move itself",{"_key":658,"_type":68,"marks":659,"text":660},"78543e680a8e1",[]," took 10 months. Dropbox, where Guido and Langa now work, took three years, and as of Guido’s retirement ",{"_key":662,"_type":68,"marks":663,"text":665},"78543e680a8e2",[664],"b92ed327230b","several weeks ago",{"_key":667,"_type":68,"marks":668,"text":669},"78543e680a8e3",[],", is still in progress. Granted, all of these are enormous codebases, but you have to wonder: if it takes that long with the top people in Python working on it, how long would it take for a regular company, maybe one where Python is not even the primary language?\n",[671,672],{"_key":655,"_type":91,"href":373,"reference":12},{"_key":664,"_type":91,"href":673,"reference":12},"https://blog.dropbox.com/topics/company/thank-you--guido",{"_key":675,"_type":64,"children":676,"markDefs":681,"style":72},"43ee8388f6e2",[677],{"_key":678,"_type":68,"marks":679,"text":680},"43ee8388f6e20",[],"In all the cases, politics played just as important of a role as technical direction.\n",[],{"_key":683,"_type":64,"children":684,"markDefs":697,"style":72},"ada50d4927ac",[685,689,693],{"_key":686,"_type":68,"marks":687,"text":688},"ada50d4927ac0",[],"Second, ",{"_key":690,"_type":68,"marks":691,"text":692},"ada50d4927ac1",[605],"security concerns",{"_key":694,"_type":68,"marks":695,"text":696},"ada50d4927ac2",[]," are a problem. Ironically, you would assume that not upgrading would be the bigger risk, but in larger organizations, many people are not allowed to upgrade Python by themselves: the admin or security team pushes updates to them. In some cases, PIP downloads are also not allowed. If Python 2 is the default agreed-upon by the security team, it can take a monumental effort to convince people to make the switch to 3, particularly in settings that are heavily regulated (such as healthcare or finance), and government.\n",[],{"_key":699,"_type":64,"children":700,"markDefs":730,"style":72},"1113609e82e7",[701,705,709,713,718,722,727],{"_key":702,"_type":68,"marks":703,"text":704},"1113609e82e70",[],"This brings us to the third reason: ",{"_key":706,"_type":68,"marks":707,"text":708},"1113609e82e71",[605],"inertia",{"_key":710,"_type":68,"marks":711,"text":712},"1113609e82e72",[],". Although many versions of Linux, such as ",{"_key":714,"_type":68,"marks":715,"text":717},"1113609e82e73",[716],"aee212711177","RHEL",{"_key":719,"_type":68,"marks":720,"text":721},"1113609e82e74",[],", for example, are including Python 3 alongside Python 2, it is by no means the default, and in switching between 2 and 3, some bugs are constantly being found, especially with pointers to system versions of Python, ",{"_key":723,"_type":68,"marks":724,"text":726},"1113609e82e75",[725],"c9f05f19fd9b","for example, at Debian",{"_key":728,"_type":68,"marks":729,"text":512},"1113609e82e76",[],[731,733],{"_key":716,"_type":91,"href":732,"reference":12},"https://developers.redhat.com/blog/2019/05/07/what-no-python-in-red-hat-enterprise-linux-8/",{"_key":725,"_type":91,"href":734,"reference":12},"https://lists.debian.org/debian-python/2019/10/msg00043.html",{"_key":736,"_type":64,"children":737,"markDefs":742,"style":72},"264b13ab61b4",[738],{"_key":739,"_type":68,"marks":740,"text":741},"264b13ab61b40",[],"Python’s been through a long path to move from 2 to 3, and individuals and forward-looking startups have adopted it. Now the second great migration will occur when large enterprises start their migrations away from 2. With regards to Python 2, we’ll see that 40% number shrink further in 2020, but the changes will be incremental, and there will be companies running Python 2.7 well into the future.\n",[],true,"2019/11/14","For some companies who have already made the change years ago, it won’t be an issue. However, there’s a whole range of companies who won’t be making the change anytime soon, for a number of reasons. What does this change mean for companies heavily utilizing the language, particularly those who may not be ready to migrate?",{"_type":53,"asset":747},{"_ref":748,"_type":56},"image-504ad65d40bb33eeb06c0fd6e4929d045f889070-1201x631-png",{"code":750,"language":751},"\u003C!-- wp:paragraph -->\n\u003Cp>In Pycon in 2014, Guido van Rossum, the creator of Python and, at the time, the Benevolent Dictator For Life of the language, stood on stage in a shirt that had a large 2.8 written on it in block letters, with a big red no entry sign through it. “It’s time to move on to Python 3,” he said, telling the audience that they should start adopting the new version of the language into their workflows.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>After many years of hard work towards that goal from the core committers, and surrounding community of libraries, Python 2 is finally at end of life. January 1, 2020, according to \u003Ca href=\"http://pythonclock.org\">pythonclock.org\u003C/a>, is the drop-dead date for support of Python 2.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>For some companies who have already made the change years ago, it won’t be an issue. However, there’s a whole range of companies who won’t be making the change anytime soon, for a number of reasons.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>What does this change mean for companies heavily utilizing the language, particularly those who may not be ready to migrate?&nbsp; To understand the entire context of what’s going on, let’s take a stroll back through Python history.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>A brief history of Python\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The idea behind developing Python 3 was to implement a single big change that got rid of a legacy problem in Python: rendering all strings as Unicode behind the scenes. As Brett Cannon, one of the core developers of Python, \u003Ca href=\"https://snarky.ca/why-python-3-exists/\">writes,&nbsp;\u003C/a>\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>People sometimes forget how old Python is; Guido started coding Python in December 1989 and was first released as open source in February 1991. This means that Python itself predates the\u003Ca href=\"https://en.wikipedia.org/wiki/Unicode#History\"> first volume of the Unicode standard which came out in October 1991\u003C/a>. Over the intervening years, languages created after Unicode standardized chose to base their implementation for strings on encodings that could support Unicode.&nbsp;\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>….\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Supporting Unicode and text from any written language is important. Python is a language for the world, not just for those languages that support the Roman alphabet that ASCII covers. This is why Python 3 makes it \"Unicode or bust\" when it comes to text; it guarantees that all Python 3 code will support everyone in the world whether the developer who wrote the code explicitly meant for it to or not.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Unfortunately, the team assumed that everyone would make the big switchover immediately, and made Python 3 backwards incompatible, and set 2 as a maintenance branch. However, many people didn’t want to switch, because, as the\u003Ca href=\"https://www.python.org/dev/peps/pep-3000/\"> PEP for the improvement said\u003C/a>, Python 3 was “a relatively mild improvement on Python 2.” Many people didn’t switch for what they perceived to be as mostly an inconvenience. At that time, the largest difference was changing of the print statement to Python function syntax, which broke a lot of code.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>As a result, Python 2 continued to be in active development. In 2019, though, Python 3 has finally (mostly) become the default version of the language for new Python development, and many companies and projects are using the top features of Python 3: f-strings, Path, type hints, asyncio, and, of course, Unicode rendering.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>A slow adoption process\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>It’s been a long road to get to Python 3 adoption since the new major version was announced all the way back in 2008. \u003Ca href=\"https://python-release-cycle.glitch.me/\">Dustin shows \u003C/a>just how long adoption has taken:\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:image -->\n\u003Cfigure class=\"wp-block-image\">\u003Cimg src=\"https://lh6.googleusercontent.com/e9V0Ux2ic8GHhBqP0hIHbTSkpFdTDqPCxvEDBMH62XmsB_pNqPrbnPS27UxHoyHrLuWfSLO2afZq2uagQhTJkwRVIlD5EzN8L57PGQJQM4_73dvqJWnrht951Fjhpjj6ZvIebBLb\" alt=\"\"/>\u003C/figure>\n\u003C!-- /wp:image -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>At first, there were a lot of good reasons for not adopting Python 3: Most importantly, it wasn’t backwards compatible with Python 2. As a result, major libraries were hesitant to move to the platform, and in a self-fulfilling prophecy, and it was hard to port the code with a lack of supporting tools (eventually solved with things like \u003Ca href=\"https://docs.python.org/2/library/2to3.html\">2to3\u003C/a> and \u003Ca href=\"https://pypi.org/project/six/\">six\u003C/a>).&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The tipping point for conversion occurred somewhere around 2016 or so with the \u003Ca href=\"https://docs.python.org/3/whatsnew/3.5.html\">release of Python 3.5\u003C/a>, which featured matrix multiplication, the introduction of asyncio, speed improvements to OrderedDict, and an implementation of type hints that brought some static language-like features to Python.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Later versions include even more features, like the Pathlib library and f-string manipulation. With these changes, many libraries that people use (like \u003Ca href=\"https://pypi.org/project/scikit-learn/\">scikit-learn\u003C/a> for machine learning) started their migrations to Python 3.\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>As more and more dependencies started upgrading, companies started moving, too.\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>So now that we’re close to the end, what does the cutoff of Python 2 from development mean for the ecosystem of developers dependent on it?&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Judging by the state of things on the internet, you’d have thought that everyone completed their migrations. In a survey from Jetbrains, who makes IDEs like IntelliJ and PyCharm, 75% of \u003Ca href=\"https://www.jetbrains.com/research/devecosystem-2018/python/\">individual respondents\u003C/a> had indicated that they’ve already migrated. A flurry of blog posts have shown the same. For example, \u003Ca href=\"https://blogs.dropbox.com/tech/2018/09/how-we-rolled-out-one-of-the-largest-python-3-migrations-ever/\">Dropbox detailed their migration\u003C/a> in the fall of 2018. Instagram \u003Ca href=\"https://thenewstack.io/instagram-makes-smooth-move-python-3/\">migrated in 2017.\u003C/a> Facebook started in \u003Ca href=\"https://lwn.net/Articles/758159/\">2014.\u003C/a> \u003Ca href=\"https://www.splunk.com/blog/2019/07/01/admins-and-developers-we-re-transitioning-to-python-3.html\">Splunk\u003C/a>, at the urging of their customers, also did so recently.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>However, just because Python 2 is reaching end of life doesn’t mean companies will stop using it overnight. How do we know there’s still significant energy being invested into Python 2? We can check out what’s going on directly with PyPI, the Python package library. \u003Ca href=\"https://langui.sh/2016/12/09/data-driven-decisions/\">In 2016, the core developers behind PyPI started sending logs to Google’s BigQuery, for the ability to run SQL against them\u003C/a>, which makes it much easier to make architectural decisions based on usage.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>For example, if you want to see which libraries have been downloaded, by Python version, over the last 30 days, you can create a new project in BigQuery (the first 1 TB queried per month is free), and run:\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode> SELECT\n REGEXP_EXTRACT(details.python, r\"^([^\\.]+\\.[^\\.]+)\") as python_version,\n COUNT(*) as download_count,\nFROM\n TABLE_DATE_RANGE(\n  [the-psf:pypi.downloads],\n  DATE_ADD(CURRENT_TIMESTAMP(), -31, \"day\"),\n  DATE_ADD(CURRENT_TIMESTAMP(), -1, \"day\")\n )\nGROUP BY\n python_version,\nORDER BY\n download_count DESC\nLIMIT 100\u003C/code>\u003C/pre>\n\u003C!-- /wp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Even though Python 3 has been the dominant version in the community for at least a year, the latest count of individual package downloads from PyPI shows that at least 40% of all packages for September of 2019 are 2.7 downloads. Granted, this is down from 60% at the beginning of the year, but is still significant given that EOL is only several months away.&nbsp;\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:image -->\n\u003Cfigure class=\"wp-block-image\">\u003Cimg src=\"https://lh3.googleusercontent.com/JzjinPP3psT7LrnltQNzSmEuyaVKbFACsTZWt5-inWhxf8C3WpYwU3rM2XI84rpVtBPaDQNeZKMt9R9N_806yVDufAwGMtM-eDilK7idDxMQ_Wt-LUAV6038NBeRx1Znlso-OCWl\" alt=\"\"/>\u003C/figure>\n\u003C!-- /wp:image -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>On a per-library basis, \u003Ca href=\"https://www.ncsc.gov.uk/blog-post/time-to-shed-python-2\">it gets a little trickier\u003C/a>: Most Flask downloads are completed using the Python 3 version, but only 26% of botocore downloads (the AWS SDK for Python) are using Python 3.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>And, there are several libraries that are going to hold off with the migration: Twisted, \u003Ca href=\"https://twistedmatrix.com/documents/14.0.2/core/howto/python3.html\">a web framework\u003C/a>, which has only partially been ported, and \u003Ca href=\"https://www.infoworld.com/article/3194915/python-2-forever-3-projects-that-will-keep-python-2-alive.html\">PyPy,\u003C/a> a frequently-used JIT compiler, which will keep version 2 around indefinitely.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>End of life for any given piece of software usually doesn’t mean that software is no longer available. It does mean that it’s no longer updated against any security vulnerabilities or adding any further bug fixes. The Python\u003Ca href=\"https://www.python.org/dev/peps/pep-0373/\"> PEP regulating the end of life\u003C/a> (the language spec) specifies that,&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>This declaration does not guarantee that bugfix releases will be made on a regular basis, but it should enable volunteers who want to contribute bugfixes for Python 2.7 and it should satisfy vendors who still have to support Python 2 for years to come.\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>But, there are a lot of risks with not updating to Python 3—most importantly, the risk of losing security updates, not taking advantage of new \u003Ca href=\"https://www.ncsc.gov.uk/blog-post/time-to-shed-python-2\">features like type hints, and speed gains\u003C/a>.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>Why the adoption rate is so slow\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>So why aren’t we at a higher adoption rate this close to the deadline?&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>In a tongue-in-cheek post, I wrote that \u003Ca href=\"https://veekaybee.github.io/2019/05/10/java8/\">IT runs on Java 8.\u003C/a>(which is ancient by today’s standards)&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Java 8 is\u003Ca href=\"https://www.stackchief.com/blog/Which%20Version%20of%20Java%20Should%20You%20Use%3F\"> still the dominant development environment\u003C/a>, according to\u003Ca href=\"https://snyk.io/blog/jvm-ecosystem-report-2018/\"> the JVM ecosystem report of 2018\u003C/a>.\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>This holds the answer: most large organizations, outside of the hype cycle of technical news posts, move much more slowly than the press or blogs would have you think. Most major banks are still running some variation of FORTRAN and COBOL under the covers, for example.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>So while many companies are outlining their migration strategies, just the same or larger amount will stay on Python 2 for a long time. Why is this the case?&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>In reading the accounts of people who have already migrated, it’s easy to see: migrating codebases \u003Cstrong>takes a long time\u003C/strong>, is a highly political decision, and experiences inertia, even in the companies that are the highest tech, with the best intentions.\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>For example, in order to move to Python 3 at Facebook, \u003Ca href=\"https://lwn.net/Articles/758159/\">Jason Fried\u003C/a> started by rewriting a service in 2014. Along the way, he made a lot of mistakes, changed a lot of code, and did a lot of finagling to make it known that people were moving to Python 3 at Facebook by doing things like including himself in on new developer trainings. He then teamed up with Łukasz Langa, who had done the Instagram conversion to Python 3:\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>&nbsp;In 2016, he and Langa formed a brand new team in Facebook to shepherd Python within the company, which they dubbed \"\u003Ca href=\"https://en.wikipedia.org/wiki/The_Ministry_of_Silly_Walks\">The Ministry of Silly Walks\u003C/a>.\" Because they were \"the Python team,\" the \"perceived authority\" he mentioned earlier worked; people assumed they could make decisions about Python at Facebook.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>\u003Ca href=\"https://thenewstack.io/instagram-makes-smooth-move-python-3/\">Instagram’s move itself\u003C/a> took 10 months. Dropbox, where Guido and Langa now work, took three years, and as of Guido’s retirement \u003Ca href=\"https://blog.dropbox.com/topics/company/thank-you--guido\">several weeks ago\u003C/a>, is still in progress. Granted, all of these are enormous codebases, but you have to wonder: if it takes that long with the top people in Python working on it, how long would it take for a regular company, maybe one where Python is not even the primary language?&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>In all the cases, politics played just as important of a role as technical direction.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Second, \u003Cstrong>security concerns\u003C/strong> are a problem. Ironically, you would assume that not upgrading would be the bigger risk, but in larger organizations, many people are not allowed to upgrade Python by themselves: the admin or security team pushes updates to them. In some cases, PIP downloads are also not allowed. If Python 2 is the default agreed-upon by the security team, it can take a monumental effort to convince people to make the switch to 3, particularly in settings that are heavily regulated (such as healthcare or finance), and government.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>This brings us to the third reason: \u003Cstrong>inertia\u003C/strong>. Although many versions of Linux, such as \u003Ca href=\"https://developers.redhat.com/blog/2019/05/07/what-no-python-in-red-hat-enterprise-linux-8/\">RHEL\u003C/a>, for example, are including Python 3 alongside Python 2, it is by no means the default, and in switching between 2 and 3, some bugs are constantly being found, especially with pointers to system versions of Python, \u003Ca href=\"https://lists.debian.org/debian-python/2019/10/msg00043.html\">for example, at Debian\u003C/a>.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Python’s been through a long path to move from 2 to 3, and individuals and forward-looking startups have adopted it. Now the second great migration will occur when large enterprises start their migrations away from 2. With regards to Python 2, we’ll see that 40% number shrink further in 2020, but the changes will be incremental, and there will be companies running Python 2.7 well into the future.&nbsp;\u003Cbr>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:separator -->\n\u003Chr class=\"wp-block-separator\"/>\n\u003C!-- /wp:separator -->\n\n\u003C!-- wp:block {\"ref\":13752} /-->","html","2019-11-14T15:00:00.000Z",{"current":754},"why-is-the-migration-to-python-3-taking-so-long",[756,764,766,770,775],{"_createdAt":757,"_id":758,"_rev":759,"_type":760,"_updatedAt":757,"slug":761,"title":763},"2023-05-23T16:43:21Z","wp-tagcat-bulletin","9HpbCsT2tq0xwozQfkc4ih","blogTag",{"current":762},"bulletin","Bulletin",{"_createdAt":757,"_id":758,"_rev":759,"_type":760,"_updatedAt":757,"slug":765,"title":763},{"current":762},{"_createdAt":757,"_id":767,"_rev":759,"_type":760,"_updatedAt":757,"slug":768,"title":769},"wp-tagcat-python",{"current":769},"python",{"_createdAt":757,"_id":771,"_rev":759,"_type":760,"_updatedAt":757,"slug":772,"title":774},"wp-tagcat-stackoverflow",{"current":773},"stackoverflow","Stackoverflow",{"_createdAt":757,"_id":771,"_rev":759,"_type":760,"_updatedAt":757,"slug":776,"title":774},{"current":773},"Why is the Migration to Python 3 Taking So Long?",[779,785,791,797],{"_id":780,"publishedAt":781,"slug":782,"sponsored":12,"title":784},"28e560af-f0aa-4d46-bd90-f435ad604aa7","2026-06-26T14:00:27.102Z",{"_type":10,"current":783},"paging-charity-how-can-engineering-leaders-avoid-becoming-bond-villains","Paging Charity! How can engineering leaders avoid becoming Bond villains?",{"_id":786,"publishedAt":787,"slug":788,"sponsored":12,"title":790},"4b22c2a3-3779-4966-93eb-5230391dbdce","2026-06-23T14:08:58.595Z",{"_type":10,"current":789},"your-ai-shipped-a-backend-that-boots-that-is-the-whole-problem","Your AI shipped a backend that boots. That is the whole problem.",{"_id":792,"publishedAt":793,"slug":794,"sponsored":12,"title":796},"5cf362e1-fe7b-45af-b69c-914731c6a052","2026-06-23T14:00:00.000Z",{"_type":10,"current":795},"the-2026-developer-survey-is-now-open-for-human-developers-only","The 2026 Developer Survey is now open (for human developers only)!",{"_id":798,"publishedAt":799,"slug":800,"sponsored":12,"title":802},"30b995f7-7cb9-4dd8-bf71-d0685940a32b","2026-06-19T14:00:00.000Z",{"_type":10,"current":801},"dispatches-from-o-reilly-from-capabilities-to-responsibilities","Dispatches from O'Reilly: From capabilities to responsibilities",{"data":804,"sourceMap":-1},{"count":805,"lastTimestamp":806},27,"2023-05-25T09:46:59Z"]