I recently paired up with another dev running windows with Ubuntu running in
wsl, and we had a bit of a stuggle to get our project off the ground because
they were missing com system dependencies to get going.
Straight in the terminal # [1]
Open up a terminal and get your required system dependencies using the apt
package manager and the standard ubuntu repos.
sudo apt update
sudo apt upgrade
sudo apt install \
python3-dev \
python3-pip \
python3-venv \
python3-virtualenv
pip install pipx
Using an Ansible-Playbook # [2]
I like running things like this through an ansible-playbook as it give me some
extra control and repeatability next time I have a new machine to setup.
- hosts: localhost
gather_facts: true
become: true
become_user: "{{ lookup('env', 'USER') }}"
pre_tasks:
- name: update repositories
apt: update_cache=yes
become_user: root
changed_when: False
vars:
user: "{{ ansible_user_id }}"
tasks:
- name: Install System Packages 1 (terminal)
become_user: root
apt:
name:
- build-essential
- python3-dev
- python3-pip
- python3-venv
- python3-virtualenv
- name: check is pipx installed
shell: command -v pipx
register: pipx_exists
ignore_errors: y...
Posts tagged: python
All posts with the tag "python"
312 posts
latest post 2026-05-06
Publishing rhythm
The copier answers file is a key component to making your templates
re-runnable. Let’s look at the example for my setup.py.
❯ tree ~/.copier-templates/setup.py
/home/walkers/.copier-templates/setup.py
├── [[ _copier_conf.answers_file ]].tmpl
├── copier.yml
├── setup.cfg
└── setup.py.tmpl
0 directories, 4 files
Inside of my [[ _copier_conf.answers_file ]].tmpl file is this, a
message not to muck around with it, and the ansers in yaml form. The
first line is just a helper for the blog post.
# ~/.copier-templates/setup.py/\[\[\ _copier_conf.answers_file\ \]\].tmpl
# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY
[[_copier_answers|to_nice_yaml]]
Inside my copier.yml I have setup my _answers_file to point to a special
file. This is because this is not a whole projet template, but one just
for a single file.
# copier.yml
# ...
_answers_file: .setup-py-copier-answers.yml
Once I change the _answers_file I was incredibly stuck
Run it # [1]
I’m making a library of personal copier templates in my
~/.copier-templates directory and I am going to run it from there.
copier copy ~/.copier-templates/setup.py
Results # [2]
After rendering the template we have the followi...
Once you have made your sick looking cli apps with rich, eventually you are
going to want to add some keybindings to them. Currently Textual, also written
by [1]@willmcgugan [2], does this extremely well.
Fair Warning it is in super beta mode and expected to change a bunch. So take
it easy with hopping on the train so fast.
Get the things # [3]
Install them from the command line.
pip install textual
pip install rich
Import make a .py file and import them in it.
from textual.app import App
from textual.widget import Widget
from rich.panel import Panel
Make what you have a widget # [4]
If you return your rich renderable out of class that inherits from
textual.widget.Widget, you can then dock this inside of an app class
inheriting from textual.app.App.
class MyWidget(Widget):
def render(self):
my_renderable = Panel("press q to quit")
return my_renderable
class MyApp(App):
async def on_mount(self) -> None:
await self.view.dock(MyWidget(), edge="top")
await self.bind("q", "quit")
run it # [5]
You’ve made a TUI (text user interface). Run the classmethod run to display
the it in its full screen glory.
MyApp.run(log="textual.log")
Final result # [6]
At this point It prob...
pipx examples
count lines of code # [1]
pipx run pygount markata
pipx run pygount markata --format=summary
pipx run pygount markata --suffix=cfg,py,yml
References:
[1]: #count-lines-of-code
Copier Templates
%%include til/copier_endops
%%include til/copier-template-variables
%%include til/copier-answers
I was completely stuck for awhile. copier was not replacing my template
variables. I found out that adding all these _endops fixed it. Now
It will support all of these types of variable wrappers
# copier.yml
_templates_suffix: .jinja
_envops:
block_end_string: "%}"
block_start_string: "{%"
comment_end_string: "#}"
comment_start_string: "{#"
keep_trailing_newline: true
variable_end_string: "}}"
variable_start_string: "{{"
!RTFM: Later I read the docs and realized that copier defaults to using [[
and ]] for its templates unlike other tools like cookiecutter.
I’ve been looking for a templating tool for awhile that works well with
single files. My go to templating tool cookiecutter does not work for
single files, it needs to put files into a directory underneath of it.
template variables # [1]
By default copier uses double square brackets for its variables.
variables in files, directory_names, or file_names will be substituted
for their value once you render them.
# hello-py/hello.py.tmpl
print('hello-[[name]]')
note! by default copier will not inject variables into your
template-strings unless you use a .tmpl suffix.
Before running copier we need to tell copier what variables to ask for,
we do this with a copier.yml file.
# copier.yml
name:
default: my_name
type: str
help: What is your name
installing copier # [2]
I prefer to install cli tools that I need globally with pipx, this
always gives me access to the tool without worrying about dependency
conflicts, bloating my system site-packages, or managing a separate
virtual environment [3] for it myself.
pipx install copier
running copier # [4]
When running copier copy we pass in the directory of the template, and
the directory that we want to render the template into.
cop...
I just installed a brand new Ubuntu 21.10 Impish Indri, and wanted a
kedro project to play with so I did what any good kedroid would do, I
went to my command line and ran
pipx run kedro new --starter spaceflights
But what I got back was not what I expected!
Fatal error from pip prevented installation. Full pip output in file:
/home/walkers/.local/pipx/logs/cmd_2022-01-01_20.42.16_pip_errors.log
Some possibly relevant errors from pip install:
ERROR: Could not find a version that satisfies the requirement kedro (from versions: none)
ERROR: No matching distribution found for kedro
Error installing kedro.
This is weird, why cant I run kedro new with pipx? Lets try pip.
pip install kedro
Same issue.
ERROR: Could not find a version that satisfies the requirement kedro (from versions: none)
ERROR: No matching distribution found for kedro
What is Kedro [1]
Curious what kedro is? Check out this article.
What’s up # [2]
wrong python version
The issue is that kedro only runs on up to python 3.8, and on Ubuntu
21.10 when you apt install python3 you get python 3.9 and the
standard repos don’t have an old enough version to run kedro.
How to fix this? # [3]
Theres a couple of wa...
Pluggy makes it so easy to allow users to modify the behavior of a framework
without thier specific feature needing to be implemented in the framework
itself.
I’ve really been loving the workflow of frameworks built with pluggy. The first
one that many python devs have experience with is pytest. I’ve never created a
pytest plugin, and honestly at the time I looked into how they were made was a
long time ago and it went over my head. I use a data pipelining framework
called kedro, and have build many plugins for it.
Making a plugin # [1]
super easy to do
As long as the framework document the hooks that are available and what it
passes to them it’s so easy to make a plugin. Its just importing the
hook_impl, making a class with a function that represents one of the hooks,
and decorating it.
from framework import hook_impl
class LowerHook:
@hook_impl
def start(pluggy_example):
pluggy_example.message = pluggy_example.message.lower()
installing pluggy # [2]
Installing pluggy is just like most python applications, install python, make
your virtual environment [3], and pip install it.
pip install pluggy
Making a plugin driven framework # [4]
much less easy
At the time I sta...
pyenv provides an easy way to install almost any version of python from
a large list of distributions. I have simply been using the version of
python from the os package manager for awhile, but recently I bumped my
home system to Ubuntu 21.10 impish, and it is only 3.9+ while the
libraries I needed were only compatable with up to 3.8.
I needed to install an older version of python on ubuntu
I’ve been wanting to check out pyenv for awhile now, but without a
burning need to do so.
installing # [1]
Based on the Readme it looked like I needed to install using homebrew,so this
is what I did, but I later realized that there is a pyenv-installer repo that
may have saved me this need.
Installing Homebrew on Linux [2]
List out install candidates # [3]
You can list all of the available versions to install with
pyenv install --list. It does reccomend updating pyenv if you suspect
that it is missing one. At the time of writing this comes out to 532
different versions!
pyenv install --list
Let’s install the latest 3.8 patch # [4]
Installing a version is as easy as pyenv install 3.8.12. This will
install it, but not make it active anywhere.
pyenv install 3.8.12
let’s use python 3.8...
Part of my neovim setup requires having the black python formatter
installed and callable. I install it with pipx so that I don’t have
to manage a virtual environment [1] and have it available everywhere. So
far this works well for me, if there are ever breaking changes I may
need to rethink this.
re-installing a bunch of things that are already installed can be quite
a waste and really add up to my ansible run time, so for most of my
ansible tasks that install a command like this I have been following
this pattern.
- check if the command is installed with command -v <command>
- register that step
- ignore if that step fails
- add a when: <xxx>_exists is failed condition to the step that
installs that command.
- name: check is black installed
shell: command -v black
register: black_exists
ignore_errors: yes
- name: install black
when: black_exists is failed
shell: pipx install black
https://www.youtube.com/watch?v=MCFg6-W5SBI
I made a video based on this post, check it out if its your thing
References:
[1]: /virtual-environment/
Adding a __render__ method that returns a rich renderable to any python class
makes it display this output if printed with rich. This also includes being
nested inside a rich Layout.
import rich
from rich.panel import Panel
class ShowMe:
def __rich__(self):
return Panel("hello", border_style="gold1")
if __name__ == "__main__":
rich.print(ShowMe())
[1]
References:
[1]: https://images.waylonwalker.com/dunder_rich_showme.png
Smoother Python with automatic imports | pyflyby
This is not a flaky works half the time kind of plugin, it’s a seriously smooth
editing experience. I’ve just started using pyflyby, and it is solid so far.
I have automatic imports on every save of a python file in neovim, and
automatic imports on every command in ipython.
I can’t tell you how pumped I am for this, and how good its felt to use over
the past few weeks. It’s glorious.
YouTube video # [1]
Listen to me rant on how great pyflyby is
https://youtu.be/2QW5DJiEJH4
Give the video a watch, I did not have noise-cancelling on in obs. My
apologies for the background hum and the mic stand bumps. I did my best to fix
them up.
Installation # [2]
How to install pyflyby for automatic python imports
pyflyby is hosted on pypi, so you can get it with pip. I have had no issues
installing it on 3.8+ so far.
pip install pyflyby
Configuration setup with stow # [3]
always stow your dotfiles
If you’re going to configure any of your tools the first thing you should do is
set it up w...
Kedro Course
-
find all nodes with raw in the name
-
use parameters
-
make and use a logger
-
use find-kedro in spaceflights
-
slide in a new node
-
vizualize your pipeline
-
find slow nodes
-
move the configuration directory
-
build kedro into docker and run it
-
pyinstrument
-
pdb
-
make a new cli command
-
make a hook
-
load catalog entries
-
slice a pipeline
- by tag
- by name
- from inputs
- to outputs
kedro catalog create
I use kedro catalog create to boost my productivity by automatically
generating yaml catalog entries for me. It will create new yaml files for each
pipeline, fill in missiing catalog entries, and respect already existing
catalog entries. It will reformat the file, and sort it based on catalog key.
https://youtu.be/_22ELT4kja4
What is Kedro [1]
👆 Unsure what kedro is? Check out this post.
Running Kedro Catalog Create # [2]
The command to ensure there are catalog entries for every dataset in the passed
in pipeline.
kedro catalog create --pipeline history_nodes
- Create’s new yaml file, if needed
- Fills in new dataset entries with the default dataset
- Keeps existing datasets untouched
- it will reformat your yaml file a bit
- default sorting will be applied
- empty newlines will be removed
CONF_ROOT # [3]
Kedro will respect your CONF_ROOT settings when it creates a new catalog
file, or looks for existing catalog files. You can change the location of your
configuration f...
Using Nix to manage my Python Interpreter
I recently started playing with nix.
goals # [1]
- automatically select correct python version per project
- activating one doesn’t bleed into the other
Installing nix # [2]
curl -L https://nixos.org/nix/install | sh
controlling nix-env # [3]
nix-env -iA nixpkgs.python310
nix-env -iA nixpkgs.python39
nix-env -iA nixpkgs.python38
nix-env -iA nixpkgs.python37
searching for packages # [4]
https://search.nixos.org/
nix-env -qaP .\*python.\*
nix search nixpkgs python
shell # [5]
nix-shell -p python39
References:
[1]: #goals
[2]: #installing-nix
[3]: #controlling-nix-env
[4]: #searching-for-packages
[5]: #shell
nvim conf 2021 | IDE's are slow | Waylon Walker
https://youtu.be/E18m4KkJUnI
---
Slides 👇 # [1]
welcome # [2]
Other possible titles # [3]
- Using Vim as a Team Lead
- I 💜 Tmux
- Why I stopped using @code
- Get there fast
- How I vim
It’s ok # [4]
Use a graphical IDE if it works for you.
Trick it out # [5]
vim is so well integrated into the terminal, take advantage
It wasn’t working for me anymore # [6]
dozens of instances # [7]
As a team lead I bounce betweeen a dozen projects a per day
https://pbs.twimg.com/media/FAEmRjYUcAUk2eR?format=jpg&name=large [8]
Move With Intent # [9]
Running vim inside tmux lets me move swiftly between the exact project I need.
https://twitter.com/_WaylonWalker/status/1438849269407047686/photo/1// [10]: <> (__)
Hub and Spoke # [11]
- direct link to specific projects
- fuzzy into all projects
- fuzzy into open projects
How I navigate tmux in 2021 [12]#hub-and-spoke
Other Things That Make this Possible # [13]
- tmux
- direnv
vim adjacent things
yes, vim is ugly, make it your...
Kedro-Broken-Urls
Broken Urls # [1]
- https://github.com/josephhaaga) [ ] https://example.com/file.h5
- https://raw.githubusercontent.com/kedro-org/kedro/develop/static/img/pipeline_visualisation.png
- https://example.com/file.txt
- https://github.com/jmespath/jmespath.py.
- https://github.com/tsanikgr)
- https://example.com/file.csv
- https://kedro.readthedocs.io/en/latest/04_user_guide/15_hooks.html
- https://kedro.readthedocs.io/en/stable/07_extend_kedro/04_hooks.html
- https://github.com/EbookFoundation/free-programming-books/blob/master/books/free-programming-books.md#python
- https://github.com/quantumblacklabs/private-kedro/blob/develop/docs/source/04_user_guide/04_data_catalog.md
- http://example.com/api/test
- https://example.com/file.parquet
- https://kedro.readthedocs.io/en/stable/11_faq/01_faq.html#how-do-i-upgrade-kedro
- https://example.com/file.xlsx
- https://www.datacamp.com/community/tutorials/docstrings-python
- https://github.com/mmchougule)
- https://example.com/f...
Just Ask Ipython for help
It happens to the best of us # [1]
We can’t all remember every single function signature out there, it’s just not
possible. If you want to stay productive while coding without the temptation
to hit YouTube or Twitter. Use the built in help. Here are 5 ways to get help
without leaving your terminal.
https://youtu.be/TZrRAP-9UMk
Docstrings # [2]
In any python repl you can access the docstring of a function by calling for help.
help(df.rolling)
In Ipython we can even get some syntax highlighting with the ?.
df.rolling?
Source Code # [3]
Sometimes the docstrings are not good enough, and don’t give us the content we
need, and we just need to look at the source. Without leaving your terminal
there are two ways I often use to get to the source of a function I am trying
to use.
import inspect
inspect.getsource(df.rolling)
The more common way I do it is with the ipython ??.
df.rolling??
Bonus rich.inspect # [4]
You thought the syntax highlighting was good with ipython, check out w...
Setting Parameters in kedro
Parameters are a place for you to store variables for your pipeline that can be
accessed by any node that needs it, and can be easily changed by changing your
environment. Parameters are stored in the repository in yaml files.
https://youtu.be/Jj5cQ5bqcjg
What is Kedro [1]
👆 Unsure what kedro is? Check out this post.
parameters files # [2]
You can have multiple parameters files and choose which ones to load by setting
your environment. By default kedro will give you a base and local
parameters file.
- conf/base/parameters.yml
- conf/local/parameters.yml
base # [3]
The base environment should contain all of the default values you want to run.
# /conf/base/parameters.yml
test_size: 0.2
random_state: 3
features:
- engines
- passenger_capacity
- crew
- d_check_complete
- moon_clearance_complete
- iata_approved
- company_rating
- review_scores_rating
NOTE base will always be loaded first.
accessing parameters # [4]
Parameters can be accessed through context or throug...