Transcript #65: Speed of your import statements affecting performance?
Return to episode page view on github00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:04 This is episode 65, recorded February 7th, 2018.
00:09 I'm Michael Kennedy.
00:09 And I'm Brian Atkin.
00:10 And we got a bunch of cool stuff.
00:13 I really am excited to share a couple of these things with you.
00:16 And I'm excited to have Rollbar as a sponsor.
00:19 So you probably heard about Rollbar from other episodes.
00:21 If you want to check them out, we got a special offer at pythonbytes.fm/rollbar.
00:25 Tell you more about that later.
00:27 I kind of want to know about some charts.
00:29 I have got like this just, have you ever used, seen the test output on like Jenkins?
00:35 If you have testing?
00:36 No, I haven't played with Jenkins.
00:37 Okay, well, so in Jenkins builds, there's this thing where you can, after you run your tests, you can have it display your past and failed tests in this little graph.
00:47 It's just a little chart.
00:48 It's an area chart.
00:49 I wanted one of those, but I wanted something that would show like five of those charts, a whole bunch of them.
00:56 So it doesn't do it automatically.
00:57 I probably could have hunted into Jenkins or something, but I wanted to build my own thing.
01:02 So I want to do it in Flask.
01:04 And I've been trying to figure this out.
01:06 And there was a great tutorial by--
01:09 this is going to be a little story anyway.
01:11 But there was this great tutorial by Matt McKay from Fullstack that showed how to do this, almost how to do this in Bokeh.
01:20 Yeah, very nice.
01:21 That's a cool project, too.
01:22 Yeah, but Bokeh, the current version of Bokeh, dropped the charting feature.
01:27 That's not helpful.
01:29 But there goes your solution you just found.
01:30 - Yeah, so I'm trying to do it in, and I gave up and asked Twitter.
01:34 And what came back was one of these options was PyGAL, P-Y-G-A-L, which ends up very, it's very simple, but I can, within 20 minutes, I had a Flask app running with these charts up.
01:47 So it's not as hugely featured as some of the other graphing applications, but it's very cool.
01:54 And it also can export SVG.
01:56 So these are small.
01:58 It's pretty small also when you're displaying these.
02:00 - That's cool.
02:01 And the SVGs can have basically infinite, very high levels of sort of zoom ability, right?
02:08 Because they're scalable, right?
02:10 That's their first name.
02:12 That's the S.
02:13 They also do PNGs, like you said, that's cool.
02:15 And they have a bunch of great looking charts.
02:16 Like these are really nice.
02:18 So you can do like bar charts or PI or the radar ones, all sorts of good stuff.
02:22 - So I still want to get something like Bokeh or something like that to work so that I can make them interactive because these aren't interactive things. You build them and just display them. But for my needs right now, that works. And it's very nice. Yeah, very nice. And kudos to the people writing the documentation because they have documentation on how to pretty much they have it in Django, Flask, and pretty much any HTML that you want to throw this in, how to do that.
02:48 Oh, yeah, that's super cool. And they have nice pictures, which is always really powerful when when you're talking about graphs or UI or things like this.
02:57 You can just sit by the picture and go, "Okay, I want this, now I'll pay attention." Really nice.
03:01 So a lot of people send us messages and they ask for advice on like a sort of career path or I'm thinking about this technology or how do I get started in programming or something like that.
03:12 And there was this really interesting post over on Reddit under Learn Programming.
03:18 And so it's not technically a Python thing, but a bunch of Python people are hanging out there.
03:22 So that's kind of cool.
03:24 And the idea was this guy, he gets a guy who wrote me.
03:28 Anyway, person posted it, sent a message and said, "Hey, look, I'm 31 days into a self-study program on Python.
03:35 "I'm loving every minute of it.
03:37 "Couple of questions.
03:38 "Could you all fill this out "just so we can share our experiences?" - Oh, interesting.
03:42 - Isn't that cool?
03:43 So what were you doing before you began self-study and programming?
03:46 So it's for people who are doing self-studying.
03:48 What made you want to study programming on your own?
03:51 How did you get started?
03:52 How long did it take for you to feel confident enough in your skills and knowledge to think that you could be employed?
03:58 What else did you do besides self-study that helped you?
04:01 And what's next?
04:03 And this thread just blew up on Reddit.
04:06 And there's all these really interesting conversations.
04:09 And so anyone out there who is sort of in the early stages of self-study, maybe they're doing 100 days of code type thing, or they're in a bootcamp, or they're taking online courses.
04:19 I know a few places have good ones of those.
04:22 I think going through here and reading this, it would be really, really valuable to sort of have that shared experience.
04:29 Isn't that cool?
04:30 - Oh, that's great.
04:31 - Yes, so there's another story that's linked from there.
04:33 So this one doesn't technically count as an item, but people might also find it interesting as a thread to keep following is someone said, oh, there are people who are like 30, 40, like, hey, I'm learning to code in my 40s, and you guys are really inspiring me to realize this is actually possible.
04:49 and it's not too late for me, you know.
04:51 So there's this article called "Stories from 300 Developers who got their first tech job in their 30s, 40s, and 50s" linked from there.
04:59 - That's cool.
05:00 I gotta go read that.
05:00 - Yeah, and I think that might be real helpful to some folks as well.
05:03 So if you're in this space and you want some shared experiences and to connect with some people, check out this thread we're linking to 'cause I think it's helpful.
05:10 - On that topic of learning, actually there's a couple episodes of "Test and Code" that'll be good.
05:16 I just did one recently about extended learning through universities, which I hadn't considered before.
05:23 And then also there's an upcoming, I'm talking with Stephanie Hurlburt on talking with mentors and opening yourself up to be a mentor as well.
05:33 - Yeah, yeah, very cool.
05:34 I'm looking forward to checking those out.
05:35 - This is one of those well-planned, awesome transitions.
05:38 - Amazing.
05:39 So one of the things that you probably don't care about when you're getting started is how fast your imports run.
05:44 You probably don't even know what an import is at the beginning.
05:46 - Exactly, but import, how long it takes to import your different modules is part of the painful startup process of any Python application.
05:56 And I didn't really know how to debug that, actually.
05:58 I never really thought of it before, but in Python 3.7 coming up, there will be a, there is a -x import time that allows you to, there's a flag that you can run that allows you to investigate and profile all of the time for importing different libraries, which sounds really cool, actually.
06:19 - Yeah, that is really, really quite cool.
06:22 And so you can just basically run it and it'll tell you this library took that long to import, this other library took that long to import, and so on.
06:31 And I didn't realize how long some of these actually took to load.
06:34 - And like any optimization, it's probably never where you really think it's gonna be.
06:39 It's probably someplace else.
06:40 So having it profiled is great.
06:42 And sometimes you just have to import things, but some parts of your system may have too many imports initially and they could be possibly delayed till later.
06:53 - Yeah, you could definitely possibly do it conditionally.
06:56 If you only know in certain circumstances that code's gonna run, so you could maybe somehow delay the import until you actually need it.
07:04 So a lot of cool things, right?
07:06 - Like let's say you've got an editor application or something, all of the stuff that you'd need to, I don't know, like convert your format for saving.
07:15 You don't really need that all the time.
07:17 You could load it when somebody's trying to save.
07:20 - Right, wait for it to hit the command S, control S, something like that, that's right.
07:23 - Yeah. - Yeah, so very, very cool.
07:25 So this is a feature of Python 3.7, huh?
07:26 This is like in the new fancy version?
07:29 - Yeah, it's in the new fancy version, but I mean, everybody's probably, if you've got an application working in 3.6 right now, you're probably thinking about making sure that it's gonna work in 3.7 by now, and you can probably use the 3.7 to optimize current code anyway.
07:45 - Right, because you want data classes and why not be able to time your imports while you're at it?
07:48 - Yeah.
07:50 - Nice, yeah, so this just came out in beta last week and we already talked about that.
07:55 So here's one more thing you can do if you've got some library that's taken a while to basically import.
08:02 I think that article that you mentioned, that you know, John, the conclusion it says, So I can reduce my time for pip and --version from 800 milliseconds to 500 milliseconds.
08:13 That still sounds like a long time, but that's actually, you know, that's 60%, 30%, depending on which angle you measure it.
08:21 And not quite, but it's a big improvement.
08:23 - And it's down into the pieces where it makes it less noticeable from people.
08:28 - Yeah, quite cool.
08:29 All right, so before we move on to the next one, let me tell you about Rollbar.
08:33 So Rollbar is the thing you integrate into your web applications, whether using Django, Flask, Pyramid, super easy to integrate.
08:42 Basically to integrate it into Pyramid, you just put a few things in your config file, and that's it.
08:47 I don't even think you have to touch your code unless you want to directly interact with the Rollbar API, which you often don't have to do.
08:54 And you can even get it for JavaScript and some other frameworks as well.
08:59 And it'll basically be there when your app is running.
09:01 Anytime there's an error, it'll capture all the details, stack trace, the URL, all the request and response values, even the user who is logged in, potentially, it'll send that off and give you notification over in Slack or email or all sorts of places. So you want to make sure you're not missing errors in your web app. And if you're not monitoring it, I bet you there are errors in your web app somewhere you don't know about.
09:24 Check them out at pythonbytes.fm/rollbar.
09:28 Brian, speaking of web apps, this one we're going to talk about now is it's not the kind of web app you might've originally thought of.
09:36 I didn't mention it there in that roll bar ad.
09:39 Anpiler?
09:40 I'm not really sure about the pronunciation.
09:42 You wanna take a shot at it?
09:43 - Anpiler?
09:44 I don't know.
09:45 It's kind of fun to try.
09:46 - It's fun to try and I think the an is kind of like angular.
09:50 The pi, obviously Python.
09:52 The lar, what a great thing to put it in a word.
09:55 But what it is, is it's a web framework for building front-end, rich client, spa-type applications.
10:04 So it's a Python framework.
10:06 You write in it, it runs on the client side in the browser.
10:10 Isn't that interesting?
10:12 So it says basically, create web apps with the elegance, simplicity, and full power of Python.
10:18 And you get these sort of reusable components.
10:19 It's very much like AngularJS in that regard that has like a routing engine, so you don't actually navigate, but you move around the different views of the app.
10:28 you write all this stuff in Python, it's pretty interesting.
10:32 So it's got a reactive programming model, it has promises, standard Python formatting, reusable components, the scope styling, integrated routing engine, that's the navigation stuff I was talking about.
10:44 So it's pretty cool, actually.
10:47 I don't know what the underlying technology is for making the Python run, if they've built their own thing, if they're using something like Brython or Sculpt or something else, but yeah, it's pretty amazing.
10:58 - Yeah, it sounds like it'd be fun to play with.
10:59 - Yeah, it's definitely fun to play with.
11:00 The one caveat is if you're going to embed Python compiled to JavaScript in a JavaScript file and download it, that JavaScript file may be bigger than standard JavaScript file sizes.
11:16 So I checked and I think the minified version's 3.6 megs, which is--
11:21 - A little large.
11:22 - It depends on your use case.
11:24 So imagine this, on one hand, If you're building like a really high traffic website, people use it for mobile or low speed connections, it's totally unacceptable to put your front end in this.
11:36 However, if what you're doing is you're building Electron JS apps, you're building Ionic and Cordova apps, these sort of offline, like here are my files, run them as if it was a web app, it doesn't matter if the thing is big, right?
11:51 It just starts up off the local disk anyway.
11:54 - Yeah, that's true.
11:54 That's a great use case.
11:56 Right, like VS Code, for example, is Electron.js.
11:59 Ionic is a bunch of cool stuff.
12:01 And in that circumstance, like you just, who cares if your uncompressed shipping size is another three megs?
12:07 It's already 100 megs.
12:08 Like what's 100 versus 103?
12:10 Nobody cares, right?
12:11 Something like that.
12:12 So for those situations where it's kind of this offline, rich client web experience, it's cool.
12:18 I like it.
12:19 - Oh, that's cool.
12:20 That's a good idea.
12:21 - Yeah, so there's some nice ways to play around with it.
12:22 They got some little demo apps.
12:23 So like down the bottom, there's like a little grid of buttons, like eight or 10 or something.
12:28 You can click around there and play with it a bit.
12:30 So yeah, it's pretty cool.
12:32 If you wanna give this a try and your use case makes a lot of sense, right?
12:37 Like it's somehow getting that JavaScript there is not a big problem.
12:41 Definitely check it out, it's cool.
12:42 The other thing to point out is WebAssembly is coming.
12:45 WebAssembly is gonna be pretty sweet.
12:48 If somebody can get a really nice version of Python in WebAssembly, that may make a big difference on a lot of fronts.
12:56 Do you know WebAssembly?
12:56 - I do not.
12:57 - So WebAssembly basically is a new standard for the browsers.
13:02 I think it's already partially supported where instead of shipping JavaScript, you ship binary executable equivalents, right?
13:10 So you've got the problem of running, you download a text version of a big thing and then you parse it, you do all the sort of runtime stuff to get it executable and then you execute it, right?
13:23 You get into like byte code or whatever JavaScript does.
13:26 So I think WebAssembly is more or less like we're going to get it to that last pre-processed step of what JavaScript would do.
13:33 And we'll give it to you as a binary thing, sort of like shipping PYC files in Python.
13:38 I think it actually has more effect.
13:39 So it should be a lot smaller 'cause it's small and tokenized and stuff, but it should also start up quicker.
13:44 So who knows, maybe WebAssembly makes this better for somebody sneaking JavaScript or Python through the JavaScript straw.
13:51 - Running random binaries off of any website on the internet, what could go wrong?
13:55 - I think it's only the equivalent of running JavaScript.
13:58 It's not like fully executing data.
14:01 So it's-- - Yeah, okay.
14:02 - I think it's no worse than JavaScript, but yeah.
14:04 - Okay. - I don't know more than that.
14:06 - We'll have to keep track.
14:07 - I think we should round out this entire, the rest of this episode on just Python 3 stuff.
14:11 What do you think?
14:12 - I don't think on this podcast we've pushed the migration to Python 3 enough.
14:16 - No, we have talked about how bad legacy Python is.
14:19 Go ahead. - Yeah.
14:21 - You go first on this Python thing.
14:23 - And this is actually just a little GitHub repo that is called Migrating to Python 3 with Pleasure, a short guide on features of Python 3 for data scientists.
14:34 And it's a pretty quick read, but it's pretty thorough and actually gets pretty exciting.
14:40 There's a, starts off with a quick tutorial with examples of how to use pathlib so that you can easily, if people haven't played with it yet, you can define paths as just like these little strings with division marks like you would in a browser.
14:57 - It's kind of crazy, right, Pathlib?
14:58 It's like you put the slashes outside the strings and the division operator becomes like OS.path.join type of things.
15:06 - Yeah, definitely.
15:08 But it works great and it makes your code really readable.
15:10 So there's that and then it goes on to talk about type hinting and how cool it works with thing editors like PyCharm and stuff to help you see what you're doing.
15:19 Then one of the things that I did not, hadn't heard of before I came about a few things in here is the, how to enforce types at runtime.
15:29 I didn't know you could do that, but there's a package called enforce that you can put a decorator on a particular function and it'll throw an error if somebody tries to put it, pass in the wrong type.
15:41 - I had never heard about that either.
15:42 - That is really awesome.
15:44 I don't know if I necessarily want it all the time, but it could be fun to turn on, especially if you're like doing a refactoring or you're like doing some major upgrade.
15:53 You're like, all right, let's turn this on and just see if it's doing what we think it's doing, right?
15:58 - Yeah, especially during like a testing phase or something.
16:01 It'd be fun. - Yeah.
16:02 - And then this kind of hurt my head.
16:03 There was some function annotations for units.
16:07 There's an example is how Astropy does it.
16:10 And it's things like you can attach to variables like units, like kilograms or something like that, which that just seems cool.
16:20 I got to play with that a little bit more.
16:22 - Oh, it looks like, which one is it?
16:25 There's a library of things called pint.
16:27 - Oh, right, yeah, like pint.
16:28 - Right, that lets you like multiply, say like, you know, this thing time a foot, that thing times an inch and then add them together.
16:36 Yeah, yeah, that's it.
16:37 And this looks like a little bit of the same type of story, but you might multiply by like a kilogram or a degree, and sort of the physicist, astrophysicist equivalent of that.
16:47 That's cool.
16:48 - Like in their example, they show dividing a meter in speeds in, I don't know what it is, but coming up with like a terahertz, we didn't start with terahertz, you started with something else.
17:00 Okay, now I'm just making up words now, I think.
17:02 (laughing)
17:04 - Pretty cool, pretty cool.
17:05 - You also have matrix multiplication in there.
17:07 - Yeah, matrix, which I don't use a lot, but it's very cool for people that need matrix multiplication.
17:12 - Matrix multiplication is interesting.
17:13 It's one of these things, it's held up as one of the best examples of the whole PEP process in bringing a new feature into the language.
17:22 So from the time the PEP was proposed until it was done was like eight days.
17:28 - Wow.
17:29 - And it has to do with how well the people who proposed the idea had already done sort of market research amongst all the scientific computation people and they had a really clear vision and a strong sort of displayed need.
17:42 And so it's really interesting that that's in here as well.
17:44 - And globbing with star star, which is something I hadn't used since, oh, one of the Z shell does that.
17:52 So like you can do recursive subdirectories with two asterisks and that's kind of neat.
17:59 And then we threw a whole bunch of other stuff like f-strings and floating division now is real division now.
18:06 And the rest of it is things that, if you've been living Python 3 for a while, you just kind of take this stuff for granted.
18:13 But it's a fairly complete list.
18:16 It would be good if you're in a science community and you're trying to convince somebody to switch to Python 3, this article would be a good one.
18:22 - Yeah, definitely a good one.
18:24 It sounds really interesting.
18:25 It really brings out, these are the benefits that you get from making this move, rather than just the stick of, that's going to be expired or go out of maintenance in 2020.
18:36 It's like, here's all the good stuff that you're missing that you don't even know you're missing.
18:39 - Yeah, and I didn't even list it, but it includes like a dictionary ordering and stuff, which I love that.
18:48 - Right, yeah, that is really, really nice.
18:50 I think Enforce might be the big news out of that.
18:52 I hadn't even heard of that.
18:53 That's pretty cool.
18:54 - Yeah, I'm definitely gonna go play with that tomorrow.
18:56 So that's neat.
18:57 - Cool, so let's talk about moving to Python 3.
18:59 - Okay.
19:00 So I want to give you the--
19:02 - Completely new topic.
19:02 - Exactly, I want to give you something like this, but from a web development perspective, it's pretty interesting.
19:09 There's this place called TicketEA.com, TicketEA?
19:12 I don't know, TicketEA.com is what I'm gonna go with.
19:15 And they said, "How we migrated TicketEA.com "to Python 3 in two weeks." So it's apparently a pretty big project that they have running, it runs their whole sort of fulfillment e-commerce type thing and so on.
19:28 And you'll hear the word Aphrodite, That's kind of their code name word for their project.
19:34 So they do a bunch of stuff with Docker.
19:36 And their first step was to just say, okay, we're gonna change the Aphrodite's base Docker image to Python colon 3.6 slim from, I don't know, what's it, 2.7 fat?
19:47 I don't know.
19:48 Something like this.
19:49 And they said when they did that, they just tried to run their tests and a bunch of stuff went crazy.
19:53 Like outdated libraries didn't work, base string had to be moved to string, URL pars, how to move to urllib.urlpars, other stuff like that, right?
20:03 So, said, all right, well, the first thing we're gonna do is we're gonna run two to three, right?
20:07 So this is the utility that can manually fix some of those things.
20:10 We're like, every time we see base string, that's str now.
20:12 We're just gonna do that, for example, right?
20:15 So they ran that against it, and they also look for patterns like, hey, we're using map reduce, or map type functions and so on, or filtering functions plus lambdas to make it work.
20:25 and these could really just be list comprehensions, right?
20:27 So they kind of upgraded the, they took better advantage of like the new language features that were then available to them.
20:34 So that's pretty cool.
20:35 And then they said, okay, well, that's the low hanging fruit, now what?
20:40 And they had to run their tests, you know, sort of find some more problems.
20:44 They took the opportunity to upgrade, at least get ready to upgrade to Django 2 'cause they are running on Django.
20:50 So that's cool.
20:51 They said a couple of lessons we learned, code coverage was 75% or 70%, you know, the more tests, the better.
20:59 It's good to keep the Python 3 branch up to date with the master branch until you switch.
21:04 That's one way of doing it.
21:05 Like, remember the Instagram keynote at PyCon 2017?
21:09 - Yeah.
21:10 - That is a whole nother level of upgrading to Python 3, right?
21:13 They upgraded all of Instagram to Python 3 without branching, which is, yeah, at all.
21:22 That's crazy.
21:22 And they were checking in all the time.
21:24 So that's another level, you can check out that as well.
21:26 But this is, I suspect this is more common that you kind of branch, like, all right, we're gonna try to keep these going.
21:31 - It's a good story to see somebody doing it the other way.
21:34 - Yeah, for sure.
21:35 And so they ran Flake 8 against all the stuff to make sure everything was working right.
21:39 So I don't know, they said they had to modify around 200 files to make Flake 8 happy again with Python 3, but yeah, all good.
21:47 And then the final thing I thought was really cool is they're running on Google App Engine.
21:50 I don't do anything with Google App Engine, But one of the features that these platforms as a service have that's really pretty cool is something called traffic splitting.
21:59 So there's basically like a little slider and you say, this version of the app is going to get 60% of the traffic.
22:06 This version of the app is going to get 40% of the traffic.
22:08 And you can add in different versions.
22:09 So you can say, well, let's just send like 1% of our traffic over towards these new versions and see what happens.
22:17 So you don't completely take the site down.
22:19 You just may break it for a very small group.
22:22 And you could even do that, I think, by IP address and stuff.
22:26 So you could say, only the people that work here get the new version.
22:29 People on the outside, they get the old version.
22:31 And slowly migrate it along.
22:33 And so they call these canary releases, which I think is actually a pretty cool way to think of it.
22:37 So there's some neat lessons in here.
22:40 This is by--
22:41 - I didn't know Google App Engine did that.
22:43 That's neat.
22:44 - Yeah, I didn't either.
22:44 But I definitely like it a little bit better now.
22:47 That's cool.
22:48 I mean, I don't dislike it, but that's definitely a feature that would draw me into it.
22:51 - All right, so I think these are really interesting.
22:53 Yours was on data science, mine is a sort of web story, and they both are compelling, sort of for moving to Python 3.
23:00 Things that you get, the steps to get there.
23:02 - Definitely, and we'll keep pounding on it until Python 2.7 is gone.
23:06 - That's right.
23:07 We will see legacy Python fade away.
23:09 So you have a webcast coming up, don't you?
23:11 - Yeah, we brought it up last week, but I just wanted to remind people that I'm doing a webcast on pytest and PyCharm with the PyCharm guys that's coming up on February 22nd.
23:23 So we'll leave a link in the show notes and go register.
23:27 Hope to see everybody there.
23:28 - Yeah, they should definitely go register for it.
23:29 There's a couple reasons.
23:31 One, Brian's gonna be there, it'll be awesome.
23:33 Two, it's free, so you'll get what you pay for for sure.
23:37 I promise you that.
23:38 Unless you count your time, then I don't know.
23:41 And then you also potentially, if you can't make it, you'll get the recording notification.
23:45 If you register and you don't show up, then you'll get a message to say you didn't show up, but hey, you can still get it.
23:49 - People should check out, there's a whole bunch of old webinars there, and it's not just about trying to push PyCharm stuff, it's just people in the community showing some interesting things to do.
24:01 So, it's a good thing that they're doing.
24:03 - I had this project that I wanted to play with.
24:05 Not so much to build the app, but to play with the foundational bits of the app.
24:11 So I have a program that sort of demonstrates using Cookie Cutter from an API mode.
24:17 So cookie cutter, normally you write, you type cookie cutter space, some template name, and then stuff happens, and then you have a projects, like a starter project, a scaffold type thing for all sorts of various things.
24:29 So there's also an API for cookie cutter.
24:32 And so you can put like fancy front ends, or if you've got any kind of application that needs to generate like a sub project that's going to be messed with by somebody else, if you're doing like developer tools, or you're building stuff for your company, you're like, we're always gonna start this way.
24:46 So here's the CLI and it asks you the questions and then boom, you've got this kind of standard starter app that's integrated into your infrastructure.
24:54 So these are all good uses.
24:56 So I said, all right, well, I wanna play with this project called GUI and we talked about GUI a while ago, G-O-O-E-Y.
25:02 And so I took my little cookie cutter app that would work with all the pyramid based cookie cutter templates and put a friendly front end on the front of that.
25:12 And then I put a GUI on top of that CLI app.
25:16 - Nice.
25:16 - Yeah, so it's really fun and it was, it took, it really took like 20 minutes to get it 99% working, more on that in a sec.
25:23 But, so I put a link to the GitHub repository that has that up there.
25:27 So people can download it, you just clone it, create a virtual environment, pip install -r, the requirements file, and then you can just run the program and you have this really sweet GUI.
25:37 And it's based on WX Python Phoenix and GUI, and it's quite cool.
25:42 The one little hangup is I'm having a problem getting it to run if I package it so I could literally hand out a .app or a .exe.
25:51 There's some kind of hangup, and I think it's a bug with GUI.
25:54 I can't tell entirely, but maybe by the time you hear this, I have it figured out, but we'll see.
25:59 Either way, it's a great example.
26:00 You know, if you can forget the packaging, it's actually an awesome example of a really simple Python GUI app that looks professional.
26:06 - If you can forget packaging, Python is awesome.
26:09 That's a-- (laughing)
26:10 - The packaging works fine, GUI works fine, A packaged GUI app sometimes works fine.
26:15 - Yeah, okay.
26:16 (laughing)
26:17 - It's the intersection of all these things that are cool.
26:20 There's a small bruise on the shininess of it, but it's all good, it's all good.
26:25 So check that out.
26:26 - There's tons of people working on all these features to make it even more seamless in the future.
26:31 - Yeah, absolutely, absolutely.
26:33 - Well, good job, cool.
26:33 - Thanks so much.
26:34 Brian, thanks for sharing everything with all of our listeners and with me.
26:38 - Thank you, and we'll talk to you next week.
26:40 - You bet, bye.
26:42 Thank you for listening to Python Bytes.
26:44 Follow the show on Twitter via @pythonbytes.
26:46 That's Python Bytes as in B-Y-T-E-S.
26:49 And get the full show notes at pythonbytes.fm.
26:53 If you have a news item you want featured, just visit pythonbytes.fm and send it our way.
26:57 We're always on the lookout for sharing something cool.
27:00 On behalf of myself and Brian Okken, this is Michael Kennedy.
27:03 Thank you for listening and sharing this podcast with your friends and colleagues.