Transcript #118: Better Python executable management with pipx
Return to episode page view on github00:00 Hello and welcome to Python Bytes where we deliver Python news and headlines directly to your buds. This is episode 118 recorded February 19th 2019 I'm Michael Kennedy and I'm Brian Okken and this episode is brought to you by Digital Ocean check them out at Python bytes FM Slash Digital Ocean more on that later right now Brian. It's man is cold outside It's I would say it's frozen Oh, yeah, the whole transition thing. You're so good at that. The first topic is frozen flask this was sent in by somebody who I probably should have written their name down, but it was a recommended by a listener and It's actually pretty darn cool. So I've been playing with static site generators a little bit and Here's the idea is if you already have flask application up and it's mostly static content anyway, or it's got some, the activity is more JavaScripty or something.
00:59 You can just freeze that into a, like a statically servable web thing with Frozen Flask, and it's pretty painless.
01:06 - Frozen Flask looks so cool.
01:08 - Yeah, it really does.
01:09 And then I also stumbled across a tutorial that's called Dead Easy Yet Powerful Static Website Generator with Flask.
01:18 And it talks about Frozen Flask, and it also talks about an extension to Flask called Flask Flat Pages, which allows you to have a bunch of pages generated for markdown.
01:31 >> That's pretty cool. Yeah, I haven't heard of that. That's nice.
01:34 >> It's pretty fun. I'll get a warning.
01:35 I tried to go through this tutorial.
01:37 It's still got a lot of great information.
01:39 It's well-written. It's just a look since it was from 2012, it's a little out of date.
01:44 Some of the imports don't quite work, so you'll have to do some Googling.
01:47 But the frozen flask that we all see link to has some really cool.
01:51 It has, it's some pretty easy tutorials on there too.
01:54 So it's looks fun.
01:55 Yeah.
01:55 That looks really cool.
01:56 there's always this tension between having like a data driven website where maybe I've got a bunch of podcast episodes or something and they all have notes, but I want to have like a whole bunch of stuff around them and have that generated.
02:09 And of course that would be like a regular flask data driven app.
02:13 Right.
02:13 But if I'm going to do that with a static thing, like how do I do that?
02:17 Do I like create a bunch of static markdown?
02:19 How do I mix it all together?
02:20 It can be painful, right?
02:21 So frozen flask is like, well, you create the dynamic thing, but then you host it.
02:24 You don't have to deal with the infrastructure hosting.
02:26 You just put HTML and CSS somewhere and it runs great.
02:30 Right?
02:31 Yeah.
02:31 Like for instance, I was thinking that it'd be a neat way to do this.
02:34 I was always potentially looking for ways I can use something also.
02:38 Like if I've got a, something internal for our test team, for instance, and we want to look at all of our test data and analytics and all that stuff, having a more dynamic site would be really neat, but then also a periodic generation of like a version report or something as a static site.
02:58 This would be useful for something like that.
02:59 - Yeah, and so a place that I just want to throw out is like an extra for this part that I have no experience with, but seems super cool.
03:07 I think you also are familiar with this is Netlify.
03:09 - Yeah.
03:10 - Yeah, so Netlify is a place specifically for hosting static sites.
03:15 So it says build, deploy, and manage modern web projects.
03:18 And it gives you a global CDN, continuous integration, an automatic free HTTPS, if you even your own domain name, 100% for free.
03:27 There are ways to pay for it, but so much of it is for free that this seems like a really good option.
03:32 - Yeah, and they're not sponsoring this episode.
03:35 It's just cool.
03:35 - Nope, that's just something that's cool, that's right.
03:37 DigitalOcean, they are sponsoring this episode.
03:40 So last week, I think it was, we spoke about the new PEP that is for Dunder pi packages.
03:47 Yeah.
03:48 And you said that's awesome except.
03:49 Yeah.
03:51 It's awesome but.
03:53 And one of the challenges you said was, well, if you just want to have packages and put them in there and run your app, that's totally good.
04:00 It'll pick it up and run.
04:01 But the thing that was missing was to run the command line binary apps like pytest or Tox or PServe or you know like micro-whiskey, all those things that would then get stuffed into that place that is really nearly impossible to put into your path, right?
04:19 - Yeah, well not impossible.
04:20 - Not impossible, but it's a super pain, like every time you create a virtual environment to add it to the path, right?
04:27 So Chad Smith, who had worked on that before, well we mentioned he was part of this Python, for like local Python project to let you do like a preview interaction with that, sent us a message and said, "Hey, actually you should know about my other project "called PipX." I guess for a pip executable or something like that.
04:47 And the idea is it will execute binary Python packages in isolated environments.
04:52 And the closest analogy to this is probably Pipsy, which we have spoken about before.
04:56 - Oh yeah, okay.
04:58 - So the idea is, yeah, you can create these, you can basically, instead of pip install a thing, you can pipx install a thing, and it'll automatically create a virtual environment for you, install it and its dependencies.
05:09 And even it's even nice, it makes sure your pip is up to date, which is almost never the case when you create a new virtual environment.
05:16 And it just installs it there and then it puts it in the path.
05:20 It puts it in a location on your system that when you install PIPX is in the path, but is not in the restricted part of your operating system.
05:29 So you can pip install anything you need to run.
05:32 So you can run it from the command line in your path without doing sudo.
05:36 - Okay, so the entry points are gonna all go from a bunch of different virtual environments are all gonna go to the same place, I guess.
05:42 - Yes, it does a bunch of like linking back some place that's in the path back to the various virtual environments it manages.
05:49 - Okay, this is very cool.
05:50 Now I'm excited.
05:51 - Yeah, now I'm even more excited.
05:52 Yeah, this is super cool.
05:54 So you can safely install these packages into virtual environments, which is where they belong, but globally, but without messing up other things or putting them all into one virtual environment that's in your path.
06:05 You can do things like list the stuff that's installed, so you can see which of the, which is kind of like brew, you can say what have I installed here through pipx, which is pretty cool.
06:14 It'll also run binaries out of the py package directory as well.
06:18 So it's kind of a companion tool to Python loc as well.
06:21 - Okay, nice.
06:22 Being a Gen Xer, I'm a sucker for anything with x at the end.
06:25 - I know, it's amazing.
06:26 It's the best.
06:28 So basically you just pip install pipx, and then from then on you can say pip install like PT Python, which is an awesome thing.
06:36 You could pip install, pytest, you could pip install, all sorts of things, glances.
06:41 And there's a couple of ways in which it's sort of like PIPC, but also better.
06:46 So one of the things that I really like, you know, I made the analogy to Homebrew before, is you can go and say pipx upgrade all.
06:54 And so everything that you've installed throughout the last six months or whatever with pipx, it'll go and find those and see if there's any updates for any of your little Python utilities you've installed.
07:03 - Oh, cool.
07:04 - That's cool, right?
07:05 - Yeah.
07:06 - Yeah, and then there's also a comparison, little matrix thing.
07:08 By matrix, I mean one dimensional single line.
07:12 Anyway, there's a comparison to PIPC and it talks about how PIPX is under active development.
07:16 PIPC isn't in a bunch of other stuff.
07:20 It's based on Python 3.6 and so on.
07:22 It uses VENV, not virtual environment.
07:25 There's just a bunch of little niceties.
07:27 And one that made me smile is it prints out emojis.
07:30 When it's doing stuff, it prints out little happy faces.
07:33 like little indicator emojis on the terminal, which, you know, it makes me happy.
07:37 - Yeah, what's the other thing that does that?
07:38 Pipenv does that, right?
07:40 - Yeah, yeah, yeah, and yeah, Kubernetes, some of the Kubernetes tools do as well.
07:44 It's a trend I'm seeing coming along here, but there's a lot of smiley, happy little things on the terminal, which is, you know, it doesn't hurt.
07:50 - Yeah. - Yeah, what's the next one you got for us?
07:52 - This is an article from Vicky Boykus that's called "Data Science is Different Now." It's a fairly lengthy article, but it's some pretty good information.
08:03 So here's the situation we've got.
08:05 We've been talking about data science.
08:06 Everybody's been talking about, say, data science.
08:09 There's just a lot of buzz around it.
08:11 So there's a lot of people with just a little bit of training in it going through boot camps or MOOCs or, is that how you pronounce MOOCs, MOOCs?
08:20 - I think so, yeah.
08:21 - Okay.
08:22 - M-O-O-C, the massive online courses, yeah.
08:25 - Yeah, okay.
08:26 Or they're self-taught or they get a remote degree or some other training and they wanna get a data science job.
08:32 So there's a whole bunch of people trying to get into data science and this partly can become a problem.
08:39 So the market, she notes that the market is, can be very, very discouraging for this flood of beginners because since there's a lot of beginners, there's a lot of people, the jobs are also becoming more advanced.
08:53 They have more specific requirements.
08:55 And the also just the job, the job description is sort of vague. So what is it you're actually going to be doing? And when people are actually doing it in the workplace, it seems a lot more like engineering than this shiny new thing that we've been talking about.
09:11 That's right.
09:12 It's just a kind of a good view of reality check for data science people interested in getting into it but there's a she also ends with some advice not just a complaining about it, but her advice is for people that wanted to Get into it. Her first bullet point is don't get into data science, which I just laugh. I actually laughed out loud I'm like, that's awesome advice but no basically she said just don't you know, don't follow the crowd because following what everybody else is doing is not going to differentiate you. And she recommends a backdoor approach of like starting as a junior developer or in DevOps or project management or something like that and learn a lot of data science stuff on the job and then build that up into a position that you can work at the company as a data scientist. So, you know, that sounds like a pretty good bit of advice because I feel like data scientists are a little more on their own than software developers?
10:09 - Yeah.
10:10 - Like, at a company, there'll be five or 10 software developers working on one web app or one other automation project, but how often do you have five to 10 data scientists all working on the same problem, right?
10:21 I feel like they're all kind of doing their own thing a lot of times, which, as a beginner, can make it more difficult, right?
10:28 So maybe get some of these engineering skills through the approach that you were just talking about and then branch out into that more solo side of things.
10:35 - Yeah, and then she also has like some skill, a whole list of specific skills for, like let's say you did get a junior developer job or you got some other job, which skills should you beef up on?
10:46 So she's got a bunch of, listed a bunch of skills to try to beef up on that.
10:49 So. - Yeah, what are they?
10:50 - Creating Python packages, putting R into production, which I don't like that one, you should use Python.
10:56 But anyway, what do I know?
10:57 - We'll talk more about that later.
10:59 - Optimizing Spark jobs so they run more efficiently.
11:02 I don't even know what that means.
11:03 Version controlling data.
11:05 - Ooh, that sounds neat.
11:06 Making models and data reproducible.
11:08 Version controlling SQL.
11:10 Building and maintaining--
11:11 - That sounds hard.
11:12 - Clean data in data lakes.
11:14 I love data lakes and data swamps.
11:16 It's just funny.
11:17 Tooling for time series.
11:20 Forecasting at scale.
11:21 Scaling, sharing.
11:23 Sharing of Jupyter notebooks.
11:24 Thinking about systems for clean data.
11:26 And lots of JSON.
11:28 - Yeah, that's cool.
11:29 All right, that sounds like good advice.
11:31 That's a good pick.
11:32 Speaking of good stuff and sponsored episodes, this one is brought to you by DigitalOcean.
11:39 And they, you know, it's February 19th as we're recording this, Brian, and not long ago, five days ago, was Valentine's Day, right?
11:46 - Yeah.
11:47 - Yeah, so DigitalOcean, they actually had a Valentine's Day present for the world, and their present was Database as a Service.
11:53 So until now, you would go over to DigitalOcean, you'd create a server, and then you would have to put your own database on there or use some other external service, like object rocket or something like that.
12:03 So now you can get managed Postgres databases on DigitalOcean, which is pretty sweet if you're gonna work with Postgres.
12:10 So you just check the box and they handle all the operational bits for you.
12:15 It's pretty cool, right?
12:16 - Yeah, that is cool.
12:17 - Yeah, yeah, definitely.
12:18 So check them out at pythonbytes.fm/digitalocean.
12:22 New users get $100 credit to play around with Postgres or whatever else you wanna play with.
12:26 And yeah, they're very good service and definitely can recommend them.
12:31 So this next one is pretty interesting.
12:33 It's not super actionable yet, Brian, but it starts to approach something that I'm really passionate about.
12:39 So the thing I want to tell you about is Rust Python.
12:42 So we have the language Rust, we have the language Python, and somehow they come together.
12:48 So the Rust doesn't replace the Python, it replaces the C in CPython.
12:51 The idea is like, here's a new interpreter, a new runtime built on Rust instead of on C.
12:58 - Wow. - Yeah.
12:59 So that feels like a more modern type of language to use than just C, right, to build a foundation.
13:04 And that might be a little bit nicer if they could get that working really well.
13:07 - Yeah.
13:08 - Yeah, and it's Python 3 only, so 3, 5, and above.
13:10 And basically the interpreter is written in Rust.
13:13 And this comes to us from Frederick Averpill.
13:16 So thanks, Frederick, for sending that over.
13:18 But yeah, this looks pretty interesting.
13:19 I would say it's definitely under active development.
13:21 When I was getting ready for this recording, I looked at the site, and the GitHub said, "Last commit an hour ago." So it feels like people are working on it.
13:29 You always wonder, is this thing real?
13:31 Are people doing anything?
13:32 Now I say that because they're not really ready to do much.
13:36 Like you can create a REPL and you can run some basic Python and stuff, but there's not a great standard library written with Rust foundations and things like that.
13:45 So there's a lot of work to be done, but the goals are to have a full Python 3 environment entirely in Rust with no CPython bindings or no C bindings really, and a clean implementation without compatibility hacks.
13:57 - Okay.
13:58 - Yeah, so if you want to practice some Rust and play around, there's a lot of things that you could do here that might be fun.
14:04 I think people who played with this would probably understand regular CPython better as well.
14:08 Right, obviously, if you re-implement it in another language, that'd be good.
14:12 But they have a bunch of tasks on the issue trackers and they're labeled very nicely, like good first issue and stuff.
14:17 So if people want to get started, they can do that.
14:18 - Yeah, also kind of be a fun getting in in the early stages sort of a thing to jump in and help out.
14:25 - Exactly, like in five years, if people keep working on this, this will be really hard to contribute to, but right now it'd be really easy, relatively speaking.
14:32 So why do I think this is super cool?
14:34 Well, Rust comes from Mozilla, and Rust has good support for compiling to WebAssembly, right?
14:41 - Oh, okay.
14:42 - And WebAssembly is the much better, faster, stronger way of running something in the browser.
14:48 So if this thing got off the ground, and it actually worked in a meaningful way, and it could be compiled to WebAssembly, well then, all of a sudden we have a super awesome Python implementation in the browser on the client side.
15:03 - Yeah, so we get a Python really full stack on both ends, the server and the client.
15:09 - Yeah, so it would be super cool, and this is one possible path down that.
15:13 I don't know, I don't know that that's the goal, but they do talk about WebAssembly being an option in sort of a toy sense, 'cause it's not really quite ready yet, but there's some stuff there.
15:21 So anyway, that was what really got my interest.
15:24 I'm like, okay, another implementation address.
15:26 It's kind of interesting, like, oh wait, WebAssembly support, that would be a big deal if that came along.
15:31 - Maybe in a few years we'll see something like a book called Python Script, just the good parts.
15:37 - Exactly.
15:38 Very cool, all right, well what's the next one?
15:40 - The next one is, this is an article, actually it's kind of a team up between Mike Driscoll and RealPython.
15:49 So Mike Driscoll wrote an article on RealPython called Jupyter Notebook and Introduction.
15:55 And of course, we've talked about Jupyter Notebooks before and a lot of stuff around data and around that.
16:01 However, this is actually a tutorial that I think was kind of missing.
16:05 And it's not all the cool things you can do with it, but it's, I know I want to use it.
16:11 No, really, how do I start?
16:13 And it really starts from installing it, of course, up to, and then just kind of walks through some of the real basics like creating a new, once you get it up and loaded, you've got a blank notebook or a blank interface and you can create a new notebook in there.
16:29 And then even something simple like, I didn't know that it was so easy to change the name just by clicking on the name of the untitled notebook that you get right away and you can click and rename it something else.
16:41 Talks about how to run cells.
16:43 I think I played with notebooks for quite a while before I learned the shortcut of shift enter.
16:48 And then goes through just some of the menu options and some of the neat features that you might not be obvious if you didn't think of exploring them before.
16:56 Like file has a save and checkpoint.
17:00 As you're working on a notebook, you can, it's kind of like a version control thing built into it.
17:04 You can just save it, save at different checkpoints and move on.
17:07 - That's cool.
17:08 - The edit menu has, I wouldn't have thought to look there for things like splitting and merging cells or moving cells around, but it's in there.
17:17 and then the cell menu has a whole bunch of cool ways to run.
17:21 I knew you could run a cell or run everything, but there's also things like run a subset or run everything above this cell or below this cell or something.
17:29 >> Yeah. Excellent.
17:30 >> At first when I was reading this, there's a couple of questions that I have right away when I have to start with the notebooks that wasn't covered.
17:38 I'm going to go ahead and push promote these practices right away.
17:42 When you're installing Jupyter, if you're installing it with PIP, do it in a virtual environment and then all the installs within your notebooks will go in that environment and you can keep those separate from the rest of your work of everything else.
17:55 Once you have a notebook up you can pip install within there now with the percent pip install that works now thanks to I think at least Jake Vanderplass publicized it. I'm not sure if he did the work or not but so that's kind of really what I wanted to talk to you about. This is a really good I think a good article to send to people if you're working with notebooks and you want to share something with somebody else and they've never experienced them before, just send them to this also.
18:21 Yeah, it's a good resource and, you know, very comprehensive. So definitely a good one that Mike Driscoll put up there. Now I want to round out the show talking about the Python Developer Survey results from 2018. This is the end of 2018. So this is pretty fresh from the PSF and JetBrains.
18:38 We talked about their stuff a year ago when they did it for 2017, end of 2017. So this is the next year. Have you seen this yet Brian? I've only briefly looked through it. Yeah, so there's a couple of interesting things that I pulled out and one of them is that Python usage as a main language. So one of the questions I say is do you so you're here for because you use Python is that because you use it as a secondary thing like maybe You're a C++ developer, but you use it for DevOps or something like that Or do you use it as your main language? The answer of Python is my main language is up 5% from last year That's awesome.
19:16 Yeah, so now it's 84% of the people, and it was 79 last year, so when the PSF conducted the survey.
19:23 The other big thing to talk about maybe is what do you use Python for?
19:28 And the number one thing is data analysis, and then web development, and then machine learning.
19:34 That sounds like a lot of data science and probably a lot of Jupyter stuff happening between those top three, right?
19:39 And also, one of the things that's cool about this survey is now they've been doing it for years, have a comparison, like a sort of a trend predictor.
19:46 Is the derivative positive or negative on this trend here?
19:50 And so I put those numbers down for 2018 and 2017.
19:54 So for data analysis, it's 59% of the people now use that for data analysis, use Python for data analysis.
20:00 That's up 8%.
20:01 And it's above web development.
20:03 So you might think it's a zero sum game, like more people are not doing web and now they're doing data science.
20:08 But no, like web development's up 2%, machine learning is up 7% to your R comment and all that, Right?
20:14 So, pretty interesting.
20:16 And the other thing they let you do is they let you ask four people who answered this question, let's partition their answers by whether Python is their main language or it's just kind of a secondary thing they do.
20:26 Right? - Oh, okay.
20:27 - The main takeaway of this section is that web development is the only category with a large gap separating main users of Python versus secondary ones.
20:36 Like 56 versus 36%.
20:39 20% difference depending on how you use Python.
20:42 All the other ones are pretty similar.
20:43 - Okay.
20:44 - Across us too, yeah.
20:45 - Yeah, I wanna point out a couple other things.
20:47 - Okay.
20:47 - From the survey, 93% say that they're involved with software testing or writing automated tests.
20:55 So--
20:56 - That's pretty cool, right?
20:57 - That's awesome.
20:57 Or at least maybe that's professional versus hobby.
21:00 I don't know.
21:01 Yeah, anyway.
21:02 - Yeah, but it's quite high.
21:03 And they said, they ask you which test frameworks you're using.
21:06 For test framework, pytest is number one.
21:08 - Of course.
21:09 - So that, of course, that's pretty cool.
21:11 Another one that's interesting is kind of like last year, they said sort of scientific computing, data-oriented, like data analysis, machine learning, whatnot.
21:22 How does that compare to web development?
21:24 And it's now 27% web development, 28% scientific development, they call it.
21:29 It's like data science plus machine learning.
21:31 Also, Python versus legacy Python, super good news here.
21:35 Of the surveyed folks, 84% are using Python 3 versus 16 for legacy Python.
21:41 - Yeah, that's awesome.
21:43 - That's really good, and it also is growing very rapidly.
21:45 So like 9% more people are using modern Python, which is great.
21:49 Web Frameworks, Flask is now the most popular web framework on the survey.
21:53 Django was last year.
21:54 - Yeah, that's interesting.
21:55 Yeah, but they're still really close.
21:57 - They're neck and neck for sure.
21:58 Then he goes Tornado and then Pyramid, and then Databases, Postgres, MySQL, SQLite.
22:02 Those are the top three relational, and then MongoDB is tailing along in the NoSQL bit.
22:08 And then ORMs, SQLAlchemy and Django ORM are tied for that.
22:12 Anyway, a bunch of, like, that's just skimming the service.
22:14 There's a ton of cool little interactive bits you can go explore the survey with.
22:18 - Yeah, wow, neat.
22:19 - Yeah, so good stuff.
22:20 And yeah, people should go check it out.
22:22 Of course, the links in the show notes.
22:24 All right, Brian, you got anything else you wanna share that's not one of our main topics?
22:28 - Yeah, Nina mentioned to us, you can pronounce her name, but I have trouble with this.
22:33 - Zacharina?
22:34 - Yeah.
22:34 - Zacharinko?
22:35 - She hit us up and said, "If we could plug this, it'd be great.
22:39 Mentored sprints for diverse beginners are something that's at PyCon.
22:42 I don't know if they've always been a thing, but that's something that's available this year.
22:47 It's a newcomer's introduction to contributing to an open source project.
22:51 And we have a link in the show notes.
22:53 Yeah, cool.
22:53 You do have to both.
22:54 There's a call for applications, both for projects and for participants.
22:58 That's open until March 14th and a highlight.
23:02 If you're wondering if this event is for you, it definitely is.
23:05 And we'd love to have you take part of it.
23:07 So that's a neat thing.
23:08 Yeah, it'll take place on Saturday, May 4th from 2.30 to 6.30 at the main PyCon.
23:14 So that's cool.
23:15 Yeah, that's a great thing.
23:16 I'm glad we get a chance to highlight it.
23:18 All right.
23:18 All right.
23:19 Do you got a joke for us?
23:20 I don't have a joke.
23:21 All right, I grabbed one.
23:22 This one plays a little better in cartoon form, but I'm going to try it in audio.
23:26 OK.
23:27 So if you have some pseudocode in like a sample.txt file or something like that, what's the easiest way to convert that to Python?
23:35 I don't know.
23:35 How?
23:36 You change the extension to .py.
23:38 [LAUGHTER]
23:40 It's for some reason, the pseudocode is very similarly written to Python.
23:44 And of course, it speaks to Python's readability, right?
23:46 So maybe you got to throw a colon in there somewhere, but yeah, pretty much.
23:50 And I have an extra.
23:51 I actually have two extras for you.
23:52 The first one is this Python song.
23:55 And it takes a bunch of modern songs, and it converts them into learning chapters.
24:01 So you learn things like you learn about Python basics, like looping and variables.
24:05 You learn about classes.
24:06 you learn about web design.
24:08 So there's like a little different song for each one.
24:10 It's these folks somewhere, like Sweden or Norway or somewhere like that, I can't remember, maybe Denmark.
24:16 And they put together this really funny like six and a half minute set of little songs all put together into chapters.
24:24 And it's all about Python.
24:26 - I'm totally gonna subject my daughter to this.
24:28 - Yeah, yeah, it's pretty funny.
24:29 And then I'll throw one more in there really quick for you.
24:32 Speaking of daughters, my daughter literally sent this in like about an hour ago.
24:35 And speaking of all the data analysis and data science folks, I think this one might resonate.
24:40 I'll let you be the judge.
24:42 So an infinite number of mathematicians walk into a bar.
24:46 The first one tells the bartender he wants a beer.
24:48 The second one tells the bartender he wants half a beer.
24:51 The third one says she wants a fourth of a beer.
24:53 The bartender interrupts and puts two beers on the table and says, "People, you really need to learn your limits." (laughing)
25:00 - Okay, that's funny.
25:03 - It's pretty good, right?
25:04 - Yeah, definitely.
25:05 Pretty good.
25:06 All right.
25:07 Super.
25:08 Okay.
25:09 Well, Brian, these joke segments always make me smile.
25:11 Yeah, definitely.
25:12 Yeah.
25:13 Thanks for doing the episode as always.
25:14 All right.
25:15 Thank you.
25:16 Yep.
25:17 And I guess we will see everyone at PyCascades, right?
25:18 Oh, yeah.
25:19 That will be the next thing.
25:20 This week.
25:21 Yeah.
25:22 We head out in like three days or something like that for the conference.
25:23 So if you're going to be there, hopefully we'll get a chance to meet you.
25:26 Otherwise, see you some other place.
25:28 All right.
25:29 Bye.
25:30 Bye.
25:31 Thank you for listening to Python Bytes.
25:32 Follow the show on Twitter via @pythonbytes.
25:33 Python Bytes as in B-Y-T-E-S. And get the full show notes at pythonbytes.fm. If you have a news item you want featured, just visit pythonbytes.fm and send it our way. We're always on the lookout for sharing something cool. On behalf of myself and Brian Okken, this is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.