A linha shebang é muito limitada. Sob muitas variantes unix (incluindo o Linux), você pode ter apenas duas palavras: um comando e um único argumento. Há também muitas vezes uma limitação de comprimento.
A solução geral é escrever um pequeno invólucro de shell. Nomeie o script Python foo.py
e coloque o script de shell ao lado de foo.py
e chame-o de foo
. Essa abordagem não requer nenhum cabeçalho específico no script Python.
#!/bin/sh
exec "$FOO/bar/MyCustomPython" "$0.py" "$@"
Outra abordagem tentadora é escrever um script wrapper como o acima e colocar #!/path/to/wrapper/script
como a linha shebang no script Python. No entanto, a maioria dos unices não suporta o encadeamento de scripts shebang, então isso não funcionará.
Se MyCustomPython
estivesse no $PATH
, você poderia usar env
para pesquisá-lo:
#!/usr/bin/env MyCustomPython
import …
Ainda outra abordagem é organizar o script para ser tanto um script de shell válido (que carrega o interpretador Python em si mesmo) e um script válido na linguagem de destino (aqui Python). Isso requer que você encontre uma maneira de escrever um script em duas línguas para o idioma de destino. Em Perl, isso é conhecido como if $running_under_some_shell
.
#!/bin/sh
eval 'exec "$FOO/bar/MyCustomPerl" -wS $0 ${1+"$@"}'
if $running_under_some_shell;
use …
Aqui está uma maneira de obter o mesmo efeito no Python. No shell, "true"
é o utilitário true
, que ignora seus argumentos (duas sequências de caracteres únicos :
e '
) e retorna um valor verdadeiro. Em Python, "true"
é uma string que é verdadeira quando interpretada como booleana, portanto, essa é uma instrução if
que é sempre verdadeira e executa uma string literal.
#!/bin/sh
if "true" : '''\'
then
exec "$FOO/bar/MyCustomPython" "$0" "$@"
exit 127
fi
'''
import …
O código da Rosetta tem esses scripts de idioma duplo em vários outros idiomas.