From a4938eb6e29a388c034457d6e7ca5c7248d7be4d Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Sat, 5 Sep 2026 10:58:37 -0500 Subject: [PATCH 1/4] STYLE: Use python3 in env shebangs PEP 394 does not guarantee a "python" command, and several distributions ship only "python3". Every one of these scripts already parses and runs under Python 3. Backport of #6842 on main. --- Modules/Core/Common/wrapping/test/itkImageInteropTest.py | 2 +- .../wrapping/test/BinaryDilateImageFilterTest.py | 2 +- .../wrapping/test/BinaryErodeImageFilterTest.py | 2 +- .../wrapping/test/GrayscaleDilateImageFilterTest.py | 2 +- .../wrapping/test/GrayscaleErodeImageFilterTest.py | 2 +- Utilities/Doxygen/datetime.py | 2 +- Utilities/Doxygen/mcdoc.py | 2 +- Utilities/ITKv5Preparation/EnumPrintFunction.py | 2 +- Utilities/ITKv5Preparation/replaceClassWithTypename.py | 2 +- Utilities/Maintenance/ArchiveTestingDataOnAzure.py | 2 +- Utilities/Maintenance/BuildHeaderTest.py | 2 +- Utilities/Maintenance/JREUpdate.py | 2 +- Utilities/Maintenance/VerifyURLs.py | 2 +- Utilities/Maintenance/VisualizeTestTimes.py | 2 +- Utilities/Maintenance/WhatModulesITK.py | 2 +- Wrapping/Generators/Doc/doxy2swig.py | 2 +- Wrapping/Generators/Doc/itk_doxy2swig.py | 2 +- Wrapping/Generators/Python/Tests/multiprocess_lazy_loading.py | 2 +- Wrapping/Generators/SwigInterface/igenerator.py | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Modules/Core/Common/wrapping/test/itkImageInteropTest.py b/Modules/Core/Common/wrapping/test/itkImageInteropTest.py index 8e341621408..b63c07ce802 100755 --- a/Modules/Core/Common/wrapping/test/itkImageInteropTest.py +++ b/Modules/Core/Common/wrapping/test/itkImageInteropTest.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # ========================================================================== # # Copyright NumFOCUS diff --git a/Modules/Filtering/BinaryMathematicalMorphology/wrapping/test/BinaryDilateImageFilterTest.py b/Modules/Filtering/BinaryMathematicalMorphology/wrapping/test/BinaryDilateImageFilterTest.py index 731e3ddd9a9..611048b3591 100755 --- a/Modules/Filtering/BinaryMathematicalMorphology/wrapping/test/BinaryDilateImageFilterTest.py +++ b/Modules/Filtering/BinaryMathematicalMorphology/wrapping/test/BinaryDilateImageFilterTest.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # ========================================================================== # diff --git a/Modules/Filtering/BinaryMathematicalMorphology/wrapping/test/BinaryErodeImageFilterTest.py b/Modules/Filtering/BinaryMathematicalMorphology/wrapping/test/BinaryErodeImageFilterTest.py index 4d77726302a..c9a7965ca61 100755 --- a/Modules/Filtering/BinaryMathematicalMorphology/wrapping/test/BinaryErodeImageFilterTest.py +++ b/Modules/Filtering/BinaryMathematicalMorphology/wrapping/test/BinaryErodeImageFilterTest.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # ========================================================================== # diff --git a/Modules/Filtering/MathematicalMorphology/wrapping/test/GrayscaleDilateImageFilterTest.py b/Modules/Filtering/MathematicalMorphology/wrapping/test/GrayscaleDilateImageFilterTest.py index 139e7a80f03..716f46762fc 100755 --- a/Modules/Filtering/MathematicalMorphology/wrapping/test/GrayscaleDilateImageFilterTest.py +++ b/Modules/Filtering/MathematicalMorphology/wrapping/test/GrayscaleDilateImageFilterTest.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # ========================================================================== # diff --git a/Modules/Filtering/MathematicalMorphology/wrapping/test/GrayscaleErodeImageFilterTest.py b/Modules/Filtering/MathematicalMorphology/wrapping/test/GrayscaleErodeImageFilterTest.py index 39f9febc5ac..0b58fcdb1f3 100755 --- a/Modules/Filtering/MathematicalMorphology/wrapping/test/GrayscaleErodeImageFilterTest.py +++ b/Modules/Filtering/MathematicalMorphology/wrapping/test/GrayscaleErodeImageFilterTest.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # ========================================================================== # diff --git a/Utilities/Doxygen/datetime.py b/Utilities/Doxygen/datetime.py index 7552851e48b..8801fbed1aa 100755 --- a/Utilities/Doxygen/datetime.py +++ b/Utilities/Doxygen/datetime.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright NumFOCUS # diff --git a/Utilities/Doxygen/mcdoc.py b/Utilities/Doxygen/mcdoc.py index efd37cb2b0c..eb2c2222684 100755 --- a/Utilities/Doxygen/mcdoc.py +++ b/Utilities/Doxygen/mcdoc.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import sys, os, re, glob diff --git a/Utilities/ITKv5Preparation/EnumPrintFunction.py b/Utilities/ITKv5Preparation/EnumPrintFunction.py index 26ed6dd9c72..7a4327e07ef 100755 --- a/Utilities/ITKv5Preparation/EnumPrintFunction.py +++ b/Utilities/ITKv5Preparation/EnumPrintFunction.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # \author Mathew J. Seng # This python script helps transition existing enumerations to ITKv5's strongly typed enumerations. diff --git a/Utilities/ITKv5Preparation/replaceClassWithTypename.py b/Utilities/ITKv5Preparation/replaceClassWithTypename.py index ff1eb1da80c..9268f607b79 100755 --- a/Utilities/ITKv5Preparation/replaceClassWithTypename.py +++ b/Utilities/ITKv5Preparation/replaceClassWithTypename.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # \author Hans J. Johnson # The following python script was used to make the ITK code consistent. diff --git a/Utilities/Maintenance/ArchiveTestingDataOnAzure.py b/Utilities/Maintenance/ArchiveTestingDataOnAzure.py index 43f4fc10201..cfda163a034 100755 --- a/Utilities/Maintenance/ArchiveTestingDataOnAzure.py +++ b/Utilities/Maintenance/ArchiveTestingDataOnAzure.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 description = """ diff --git a/Utilities/Maintenance/BuildHeaderTest.py b/Utilities/Maintenance/BuildHeaderTest.py index df34640bfd9..036e8ed948f 100755 --- a/Utilities/Maintenance/BuildHeaderTest.py +++ b/Utilities/Maintenance/BuildHeaderTest.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # ========================================================================== # diff --git a/Utilities/Maintenance/JREUpdate.py b/Utilities/Maintenance/JREUpdate.py index 72c4ce0de9b..5f898d565b3 100755 --- a/Utilities/Maintenance/JREUpdate.py +++ b/Utilities/Maintenance/JREUpdate.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 description = """ Update the JRE tarballs to be bundled with the SCIFIOImageIO plugin. diff --git a/Utilities/Maintenance/VerifyURLs.py b/Utilities/Maintenance/VerifyURLs.py index ee21b38677a..5401e6e9ada 100755 --- a/Utilities/Maintenance/VerifyURLs.py +++ b/Utilities/Maintenance/VerifyURLs.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import sys diff --git a/Utilities/Maintenance/VisualizeTestTimes.py b/Utilities/Maintenance/VisualizeTestTimes.py index 7b900e87c67..13db774533f 100755 --- a/Utilities/Maintenance/VisualizeTestTimes.py +++ b/Utilities/Maintenance/VisualizeTestTimes.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """VisualizeTestTimes.py diff --git a/Utilities/Maintenance/WhatModulesITK.py b/Utilities/Maintenance/WhatModulesITK.py index c09acecf01f..ddb0fe0497c 100755 --- a/Utilities/Maintenance/WhatModulesITK.py +++ b/Utilities/Maintenance/WhatModulesITK.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import os, sys diff --git a/Wrapping/Generators/Doc/doxy2swig.py b/Wrapping/Generators/Doc/doxy2swig.py index f97072b9041..3177343cbf6 100755 --- a/Wrapping/Generators/Doc/doxy2swig.py +++ b/Wrapping/Generators/Doc/doxy2swig.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Doxygen XML to SWIG docstring converter. Converts Doxygen generated XML files into a file containing docstrings diff --git a/Wrapping/Generators/Doc/itk_doxy2swig.py b/Wrapping/Generators/Doc/itk_doxy2swig.py index cd7d2dba942..3fa3f82278e 100755 --- a/Wrapping/Generators/Doc/itk_doxy2swig.py +++ b/Wrapping/Generators/Doc/itk_doxy2swig.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """Doxygen XML to SWIG docstring converter for ITK classes. Usage: diff --git a/Wrapping/Generators/Python/Tests/multiprocess_lazy_loading.py b/Wrapping/Generators/Python/Tests/multiprocess_lazy_loading.py index e95e8a8a213..394fdcaab79 100755 --- a/Wrapping/Generators/Python/Tests/multiprocess_lazy_loading.py +++ b/Wrapping/Generators/Python/Tests/multiprocess_lazy_loading.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # LazyLoading must be threadsafe # # The loading of modules in python *must* occur as a diff --git a/Wrapping/Generators/SwigInterface/igenerator.py b/Wrapping/Generators/SwigInterface/igenerator.py index 62b1a93a5c9..01180ff0ba0 100755 --- a/Wrapping/Generators/SwigInterface/igenerator.py +++ b/Wrapping/Generators/SwigInterface/igenerator.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ igenerator.py PURPOSE: From a9621917812314f0e5bae2776c2353e8b93d6bec Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Sat, 5 Sep 2026 10:58:40 -0500 Subject: [PATCH 2/4] STYLE: Replace hardcoded /usr/bin/python shebangs with env python3 A hardcoded interpreter path misses virtual environments and conda prefixes, and /usr/bin/python is Python 3 or absent on current systems. Backport of #6842 on main. --- Utilities/Maintenance/FindRedundantHeaderIncludes.py | 2 +- Utilities/Maintenance/UpdateCopyrightStatementsInITK.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Utilities/Maintenance/FindRedundantHeaderIncludes.py b/Utilities/Maintenance/FindRedundantHeaderIncludes.py index 591863fcd6c..97eaf0de3f8 100755 --- a/Utilities/Maintenance/FindRedundantHeaderIncludes.py +++ b/Utilities/Maintenance/FindRedundantHeaderIncludes.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # ========================================================================== # # Copyright NumFOCUS diff --git a/Utilities/Maintenance/UpdateCopyrightStatementsInITK.py b/Utilities/Maintenance/UpdateCopyrightStatementsInITK.py index 49871beee9f..a67a719c75e 100755 --- a/Utilities/Maintenance/UpdateCopyrightStatementsInITK.py +++ b/Utilities/Maintenance/UpdateCopyrightStatementsInITK.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # ========================================================================== # # Copyright NumFOCUS From 7c2f712e74674f4903daee05f6e93315a36294d1 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Sat, 5 Sep 2026 10:58:54 -0500 Subject: [PATCH 3/4] STYLE: Give VCL_ModernizeNaming.py a resolvable shebang "#!python" names no interpreter path, so direct execution fails with ENOENT even though the file is marked executable. main carries a resolvable shebang here already. Backport of #6842 on main. --- Utilities/Maintenance/VCL_ModernizeNaming.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Utilities/Maintenance/VCL_ModernizeNaming.py b/Utilities/Maintenance/VCL_ModernizeNaming.py index 251c75cc7d1..6ba199aa5ab 100755 --- a/Utilities/Maintenance/VCL_ModernizeNaming.py +++ b/Utilities/Maintenance/VCL_ModernizeNaming.py @@ -1,4 +1,4 @@ -#!python +#!/usr/bin/env python3 # \author Hans J. Johnson # # Now that all supported compilers simply From 84873937571fab571b9f1f225e4eec8cce9b4a04 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Sat, 5 Sep 2026 10:58:57 -0500 Subject: [PATCH 4/4] STYLE: Correct the VNL_ModernizeNaming.py env path "/bin/env" does not exist on most systems; env lives in /usr/bin. main already uses the portable form here. Backport of #6842 on main. --- Utilities/Maintenance/VNL_ModernizeNaming.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Utilities/Maintenance/VNL_ModernizeNaming.py b/Utilities/Maintenance/VNL_ModernizeNaming.py index 19dd46e64b0..d1f74727756 100755 --- a/Utilities/Maintenance/VNL_ModernizeNaming.py +++ b/Utilities/Maintenance/VNL_ModernizeNaming.py @@ -1,4 +1,4 @@ -#!/bin/env python +#!/usr/bin/env python3 # \author Hans J. Johnson # # Prepare for the future by recommending