diff --git a/build-relocatable-install.py b/build-relocatable-install.py
index 6d6a0149eaaf5f50f3bc897344a2e270ebf7f95f..3238f1ec0a0d90217d08a9ec79d159c1b0717de5 100755
--- a/build-relocatable-install.py
+++ b/build-relocatable-install.py
@@ -30,6 +30,7 @@ import os
 import re
 import shutil
 import subprocess
+import sys
 import tempfile
 
 try:
@@ -659,6 +660,9 @@ def main():
 
 
 if __name__ == '__main__':
+    assert sys.version_info >= (3, 5), \
+        'Python 3.5+ is required (configure with -Dpython=python3.5 ' \
+        'if necessary)'
     logging.basicConfig()
     main()
 
diff --git a/debian/control b/debian/control
index eb432da46c0315b5e1a8b2d96c272611dd957158..59eb42a4d46cd3cc434ea20c95d2c0c026ad519a 100644
--- a/debian/control
+++ b/debian/control
@@ -24,6 +24,7 @@ Multi-Arch: foreign
 Depends:
  bubblewrap,
  libcapsule-tools-relocatable,
+ python3 (>= 3.5) | python3.5,
  steam-runtime-tools-bin,
  ${misc:Depends},
  ${shlibs:Depends},
diff --git a/debian/gitlab-ci.yml b/debian/gitlab-ci.yml
index 42d869aed442bd2ba353f891b41560eb8fd11c05..552551ae06b3538c4e5b12198ca5070c6e5f6204 100644
--- a/debian/gitlab-ci.yml
+++ b/debian/gitlab-ci.yml
@@ -153,7 +153,7 @@ build:scout:
                 --archive "$(pwd)/_build" \
                 ${CI_ALLOW_MISSING_SOURCES:+--allow-missing-sources} \
                 ${NULL+}
-              prove -v ./tests/relocatable-install.py :: \
+              prove -epython3.5 -v ./tests/relocatable-install.py :: \
                 "$(pwd)/_build/relocatable-install"
             fi
 
diff --git a/debian/tests/relocatable-install b/debian/tests/relocatable-install
index 5a623a1dfe3ace957baf87c3ebcb4b28d0e78f86..4543ad76d73d739d942ecd42113cdf9b750d6e5a 100755
--- a/debian/tests/relocatable-install
+++ b/debian/tests/relocatable-install
@@ -20,7 +20,13 @@ apt-get -y install \
     --output "${AUTOPKGTEST_TMP}/relocatable-install" \
     --archive "${AUTOPKGTEST_TMP}"
 
-./tests/relocatable-install.py "${AUTOPKGTEST_TMP}/relocatable-install"
+if command -v python3.5; then
+   PYTHON=python3.5
+else
+   PYTHON=python3
+fi
+
+"$PYTHON" ./tests/relocatable-install.py "${AUTOPKGTEST_TMP}/relocatable-install"
 
 for archive in "${AUTOPKGTEST_TMP}"/*.tar.*; do
     echo "==== $(basename "$archive") ===="
diff --git a/pressure-vessel-test-ui b/pressure-vessel-test-ui
index dbb93d93975ddb1c826c474a3a7d2e741a6b5bc4..fe8f27ff23ddb84384d435dcfb0b7a805f0c5000 100755
--- a/pressure-vessel-test-ui
+++ b/pressure-vessel-test-ui
@@ -43,6 +43,8 @@ from gi.repository import Gtk
 
 logger = logging.getLogger('pressure-vessel-test-ui')
 
+assert sys.version_info >= (3, 4), 'Python 3.4+ is required for this script'
+
 
 def tristate_environment(name):
     # type: (str) -> typing.Optional[bool]
diff --git a/tests/cheap-copy.py b/tests/cheap-copy.py
index c01f4ffe1e936001fa190d7c57a8e51d4abe9e72..e44ed55d7786d00fc8b78df31be3b5f3fc5ad4d2 100755
--- a/tests/cheap-copy.py
+++ b/tests/cheap-copy.py
@@ -5,6 +5,7 @@
 
 import os
 import subprocess
+import sys
 import tempfile
 import unittest
 
@@ -121,6 +122,10 @@ class TestCheapCopy(unittest.TestCase):
 
 
 if __name__ == '__main__':
+    assert sys.version_info >= (3, 5), \
+        'Python 3.5+ is required (configure with -Dpython=python3.5 ' \
+        'if necessary)'
+
     try:
         from tap.runner import TAPTestRunner
     except ImportError:
diff --git a/tests/relocatable-install.py b/tests/relocatable-install.py
index 0110424bae3e54b8ea43d4c18f073c3c30a439b3..04897a36881bdee858d61d283fddde5340126d75 100755
--- a/tests/relocatable-install.py
+++ b/tests/relocatable-install.py
@@ -232,6 +232,10 @@ def main():
 
 
 if __name__ == '__main__':
+    assert sys.version_info >= (3, 5), \
+        'Python 3.5+ is required (configure with -Dpython=python3.5 ' \
+        'if necessary)'
+
     main()
 
 # vi: set sw=4 sts=4 et: