16. Anexo
*********


16.1. Modo interativo
=====================

Existem duas variantes do *REPL* interativo. O interpretador básico
clássico é compatível com todas as plataformas com recursos mínimos de
controle de linha.

No Windows, ou em sistemas do tipo Unix com suporte a "curses", um
novo console interativo é usado por padrão desde o Python 3.13. Este
oferece suporte a cores, edição multilinha, navegação no histórico e
modo de colagem. Para desabilitar a cor, veja Controlando cores para
detalhes. As teclas de função fornecem algumas funcionalidades
adicionais. "F1" entra no navegador de ajuda interativo "pydoc". "F2"
permite navegar no histórico da linha de comando sem saída nem os
prompts *>>>* e *...*. "F3" entra no "modo de colagem", o que torna
mais fácil colar blocos maiores de código. Pressione "F3" para
retornar ao prompt normal.

Ao usar o novo console interativo, saia do console digitando "exit" ou
"quit". Não é necessário adicionar parênteses de chamada após esses
comandos.

Se o novo shell interativo não for desejado, ele pode ser desabilitado
através da variável de ambiente "PYTHON_BASIC_REPL".


16.1.1. Tratamento de erros
---------------------------

Quando um erro ocorre, o interpretador exibe uma mensagem de erro e um
*stack trace* (rastreamento de pilha). Se estiver no modo interativo,
ele volta para o prompt primário; se a entrada veio de um arquivo, a
execução termina com um status de saída *nonzero* (diferente de zero)
após a exibição do *stack trace*. (Exceções tratadas por uma cláusula
"except" numa instrução "try" não são consideradas erros, nesse
contexto.) Alguns erros são irremediavelmente graves e causam términos
de execução com status de saída *nonzero*; isso pode acontecer devido
a inconsistências internas e em alguns casos por falta de memória.
Todas as mensagens de erro são escritas no fluxo de erros padrão; a
saída normal resultante da execução de comandos é escrita no canal de
saída padrão.

Digitar o caractere de interrupção (geralmente "Control"-"C" ou
"Delete") em prompts primários ou secundários causam a interrupção da
entrada de dados e o retorno ao prompt primário. [1] Digitar a
interrupção durante a execução de um comando levanta a exceção
"KeyboardInterrupt", que pode ser tratada por uma declaração "try".


16.1.2. Scripts Python executáveis
----------------------------------

Em sistemas Unix similares ao BSD, scripts Python podem ser executados
diretamente, tal como scripts shell, se tiverem a linha de código

   #!/usr/bin/env python3

(presumindo que o interpretador está na "PATH" do usuário) no começo
do script e configurando o arquivo no modo executável. Os dois
primeiros caracteres do arquivo devem ser "#!". Em algumas
plataformas, essa primeira linha deve terminar com uma quebra de linha
em estilo Unix ("'\n'"), e não em estilo windows ("'\r\n'"). Note que
o caractere "'#'" (em inglês chamado de *hash*, ou *pound* etc.), é
usado em Python para marcar o início de um comentário.

O script pode receber a permissão para atuar em modo executável
através do comando **chmod**.

   $ chmod +x meuscript.py

Em sistemas Windows, não existe a noção de um "modo executável". O
instalador Python associa automaticamente os arquivos ".py" com o
"python.exe", de forma que um clique duplo num arquivo Python o
executará como um script. A extensão pode ser também ".pyw", o que
omite a janela de console que normalmente aparece.


16.1.3. Arquivo de inicialização do modo interativo
---------------------------------------------------

Quando se usa o Python no modo interativo, pode ser útil definir
alguns comandos que sejam executados automaticamente toda vez que o
interpretador for inicializado. Isso pode ser feito configurando-se
uma variável de ambiente chamada "PYTHONSTARTUP" para que ela aponte
para o arquivo contendo esses comandos. Isso é similar ao recurso
".profile" das shells Unix.

Esse arquivo será lido apenas em sessões do modo interativo, e não
quando Python lê comandos de um script, tampouco quando "/dev/tty" é
passado explicitamente como a origem dos comandos (neste caso, teremos
um comportamento similar a uma sessão interativa padrão). Ele é
executado no mesmo *namespace* (espaço de nomes) em que os comandos
interativos são executados, de modo que os objetos que ele define ou
importa possam ser usados sem qualificação na sessão interativa.
Também é possível alterar os *prompts* "sys.ps1" e "sys.ps2" no mesmo
arquivo.

Caso deseje usar um arquivo de inicialização adicional a partir do
atual diretório de trabalho, você pode programá-lo no arquivo de
inicialização global usando um código parecido com "if
os.path.isfile('.pythonrc.py'): exec(open('.pythonrc.py').read())". Se
quiser usar o arquivo de inicialização num script, será necessário
fazê-lo explicitamente no script:

   import os
   filename = os.environ.get('PYTHONSTARTUP')
   if filename and os.path.isfile(filename):
       with open(filename) as fobj:
           startup_file = fobj.read()
       exec(startup_file)


16.1.4. Módulos de customização
-------------------------------

Python oferece dois *hooks* que permitem sua customização:
sitecustomize e usercustomize. Para entender como funcionam, primeiro
você deve localizar o diretório site-packages do usuário. Inicie o
Python e execute este código:

   >>> import site
   >>> site.getusersitepackages()
   '/home/user/.local/lib/python3.x/site-packages'

Agora você pode criar um arquivo chamado "usercustomize.py" neste
diretório e colocar qualquer coisa que quiser dentro. Isto vai afetar
toda invocação do Python, a menos que seja iniciado com a opção "-s"
para desabilitar a importação automática.

sitecustomize funciona da mesma forma, mas normalmente é criado por um
administrador do computador no diretório site-packages global e é
importado antes de usercustomize. Veja a documentação do módulo "site"
para mais detalhes.

-[ Notas de rodapé ]-

[1] Um problema com a package GNU Readline pode impedir que isso
    aconteça.
