diff --git a/.gitignore b/.gitignore
index 14be95d194bd112b5596328cf5bafcfc092e0cce..fdb495b09cd6cb36ac1fea4195dd5aede6d78cd6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,3 +35,7 @@ run-debug-*
 .pytest_cache
 
 *.json
+
+# pylint stuff
+.pylintrc.yml
+.run-pylint.py
diff --git a/run-pylint.sh b/run-pylint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..198d692fa953aff00f2dc20365eea9731bcdee24
--- /dev/null
+++ b/run-pylint.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+set -o errexit -o nounset
+
+ci_support="https://gitlab.tiker.net/inducer/ci-support/raw/main"
+
+if [[ ! -f .pylintrc.yml ]]; then
+    curl -o .pylintrc.yml "${ci_support}/.pylintrc-default.yml"
+fi
+
+
+if [[ ! -f .run-pylint.py ]]; then
+    curl -L -o .run-pylint.py "${ci_support}/run-pylint.py"
+fi
+
+
+PYLINT_RUNNER_ARGS="--jobs=4 --yaml-rcfile=.pylintrc.yml"
+
+if [[ -f .pylintrc-local.yml ]]; then
+    PYLINT_RUNNER_ARGS+=" --yaml-rcfile=.pylintrc-local.yml"
+fi
+
+python .run-pylint.py $PYLINT_RUNNER_ARGS $(basename $PWD) test/*.py $(find examples -name '*.py') "$@"