diff --git a/.gitignore b/.gitignore
index 8e4ee63f2a6f59f0ddccce9f8aa05f1ff578f77f..455360283352b1c9f40e72eb4f0976ea8848ee27 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,7 @@ doc/_build
 
 *.dot
 *.svg
+
+# pylint stuff
+.pylintrc.yml
+.run-pylint.py
diff --git a/run-pylint.sh b/run-pylint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6c7386669da645c3349bfb09355b80d0573f7273
--- /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/test_*.py examples "$@"