Com base em algumas idéias de alguns comentários, consegui montar um hack realmente feio que parece funcionar. O script se torna um script bash que envolve um script Python e o transmite para um interpretador Python por meio de um "documento aqui".
No começo:
#!/bin/bash
''':'
vers=( /usr/bin/python2.[5-7] )
latest="${vers[$((${#vers[@]} - 1))]}"
if !(ls $latest &>/dev/null); then
echo "ERROR: Python versions < 2.5 not supported"
exit 1
fi
cat <<'# EOF' | exec $latest - "$@"
''' #'''
O código Python vai aqui. Então, no final:
# EOF
Quando o usuário executa o script, a versão mais recente do Python entre 2.5 e 2.7 é usada para interpretar o restante do script como um documento aqui.
Uma explicação sobre algumas travessuras:
O material de aspas triplas que eu adicionei também permite que esse mesmo script seja importado como um módulo Python (que eu uso para propósitos de teste). Quando importado pelo Python, tudo entre o primeiro e o segundo aspas simples é interpretado como uma string no nível do módulo, e o terceiro termo entre aspas simples é comentado. O resto é Python comum.
Quando executado diretamente (como um script bash agora), as duas primeiraspas simples se tornam uma string vazia, e a terceira aspas simples forma outra string com a quarta aspa simples, contendo apenas dois-pontos. Essa string é interpretada pelo Bash como não-op. Todo o resto é a sintaxe Bash para globbing os binários do Python em / usr / bin, selecionando o último e executando exec, passando o resto do arquivo como um documento aqui. O documento aqui começa com um aspas simples em Python contendo apenas um sinal de hash / libra / octothorpe. O restante do script é interpretado como normal até que a linha '# EOF' termine o documento aqui.
Eu sinto que isso é perverso, então espero que alguém tenha uma solução melhor.