Manipulação de erros do Bash / Python?

4

Estou tentando executar um código muito básico Python que contém a manipulação de erros como Bash script, mas enquanto o código parece rodar OK em Python, o código gera problemas quando executado em Bash.

#!/usr/bin/python 
x = input('Enter your number:  ')     
try:
    x = float(x)
    print('Your number multiplied by 2 is:  ', x*2) 
except ValueError:
    print('not a valid choice')
    x == 0

Este é o relatório de erros do Bash:

Enter your number:  -p Traceback (most recent call last):
  File "cycle.py", line 3, in <module>
    x=input('Enter your number:  ')
  File "<string>", line 1, in <module>
NameError: name 'p' is not defined

Pelo que entendi, o erro de entrada teve que ser tratado pelo Python primeiro e então retornaria 0 status de saída para o Bash, mas aparentemente esse não é o caso?

  1. Meu código está correto?
  2. Existe uma maneira de forçar o Python a lidar com o erro primeiro sem evocar o Bash?
  3. Há outras armadilhas críticas ao executar programas em Python (presumivelmente escritos corretamente) como scripts Bash?
por VDV 16.06.2014 / 14:44

3 respostas

5

Você escreve seu código em Python 3 (olhando para "imprimir"), mas o shebang sugere Python 2 . Mude o shebang para

#!/usr/bin/env python3

e execute-o por:

python3 /path/to/script.py

e ele será executado bem:)

Explicação:

Como sugerido no comentário de Florian Diesch, input() mudou no Python 3:

No Python 2, input() tenta usar a entrada como uma expressão Python (como eval() ), enquanto no Python 3, input() substitui o raw_input() do Python 2.

    
por Jacob Vlijm 16.06.2014 / 14:52
2

Sugiro-lhe raw_input function do que input .

input([prompt]) -> raw_input([prompt])

Equivalente a eval (raw_input (prompt)).

Esta função não captura erros do usuário. Se a entrada não for sintaticamente válida, um SyntaxError será gerado. Outras exceções podem ser levantadas se houver um erro durante a avaliação.

Se o módulo readline foi carregado, então input() irá usá-lo para fornecer recursos elaborados de edição de linha e histórico.

Considere o uso da função raw_input() para a entrada geral dos usuários.

Você pode ver isso em link

    
por xiaodongjie 16.06.2014 / 14:51
0

Outra maneira de corrigi-lo é usar a cláusula input dentro de try . É melhor except de qualquer erro. x=0 Eu acho que você quer dizer atribuição lá. Desta forma, pode aceitar valores como: 2*3

#!/usr/bin/python 
try:
    x=input('Enter your number:  ')
    x=float(x)
    print('Your number multiplied by 2 is:  ', x*2)
except:
    print('not a valid choice')
    x = 0
    
por user.dz 16.06.2014 / 15:16

Tags