Estou totalmente perplexo e mistificado. Estou felizmente codificando e executando scripts Python a partir do terminal (e também executando o interpretador Python). Fui para a cama como um feliz usuário de Python, mas de repente não consigo executar nenhum script Python a partir do shell.
hello.py
contém:
#!/usr/bin/python3
print('Hello world!')
Mas de repente :
% ./hello.py
./hello.py: 1: #!/usr/bin/python3: not found
./hello.py: 2: Syntax error: word unexpected (expecting ")")
Mas
% python3 hello.py
Hello world!
% python hello.py
Hello world!
O que. O. Zarking. Fardwarks.
ls -la hello.py
mostra:
-rwxrwxr-x 1 Lexible Lexible 44 May 25 08:35 hello.py
Por dois pedidos de @Kulfy
% file -k hello.py
hello.py: Python script text executable\012- a /usr/bin/python3 script, UTF-8 Unicode (with BOM) text executable
% cat -e hello.py
M-oM-;M-?#!/usr/bin/python3$
print('Hello world!')$
ls -la /usr/bin/python3*
mostra:
lrwxrwxrwx 1 root root 9 Mar 13 05:20 /usr/bin/python3 -> python3.8
-rwxr-xr-x 1 root root 5457536 Apr 27 08:53 /usr/bin/python3.8
lrwxrwxrwx 1 root root 33 Apr 27 08:53 /usr/bin/python3.8-config -> x86_64-linux-gnu-python3.8-config
lrwxrwxrwx 1 root root 16 Mar 13 05:20 /usr/bin/python3-config -> python3.8-config
-rwxr-xr-x 1 root root 384 Mar 27 19:39 /usr/bin/python3-futurize
-rwxr-xr-x 1 root root 388 Mar 27 19:39 /usr/bin/python3-pasteurize
Para risos...
% which python
/usr/bin/python
% which python3
/usr/bin/python3
Até...
% python3
Python 3.8.2 (default, Apr 27 2020, 15:53:34)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello world!')
Hello world!
>>>
PS: Estou usando o Ubuntu 20.04 (Focal Fossa). Já tentei reiniciar e sudo apt install -f --reinstall python3 python3.8 python3-minimal python3.8-minimal libpython3.8-minimal
tudo sem sucesso.
Como você pode executar o script usando
python3 hello.py
, é evidente que o problema não está na instalação do Python ou nos links simbólicos. Em vez disso, o problema é com o próprio script.O shell (aqui, zsh) realmente não reconheceu o shebang como tal por causa de alguns personagens alienígenas antes
#
. Ele tentou executar todo o script com o shell/interpretador padrão, produzindo erros.Você pode usar a
-e
opção decat
para verificar o conteúdo real do script.-e
é basicamente a combinação dev
eE
.v
usa^
eM-
notação, e éE
exibido$
no final de cada linha.Depois de observar a saída de
cat -e hello.py
, parece que o script contém uma marca de ordem de byte perto de seu shebang/hashbang que pode ter sido inserida por algum software do Windows. Isso impediu que o script realmente carregasse o interpretador Python, então ele foi executado pelo zsh, causando o erro.Você pode remover BOMs e outros caracteres específicos do DOS usando
dos2unix
.dos2unix
irá cuidar de todos os caracteres/terminações de linha do tipo Windows/DOS e convertê-los para os do tipo Unix.Ou você também pode usar
sed
para remover BOMs. Como as BOMs estavam presentes em UTF-8, sua representação hexadecimal éEF BB BF
.Com a ajuda graciosa de @Kulfy, o problema parece ser alguns bytes não renderizáveis que precedem o shebang em meus scripts! Especificamente, os bytes
EF BB BF
precediam os bytes23 21
que deveriam ser o início do(s) script(s).Como essa marca de ordem de byte chegou lá é um mistério, mas pelo menos agora: