web-dev-qa-db-fra.com

EOFError: EOF en lisant une ligne

J'essaie de définir une fonction pour créer le périmètre d'un rectangle. Voici le code:

width = input()
height = input()
def rectanglePerimeter(width, height):
   return ((width + height)*2)
print(rectanglePerimeter(width, height))

Je pense que je n'ai laissé aucun argument ouvert ou quoi que ce soit du genre.

13
Chimp
width, height = map(int, input().split())
def rectanglePerimeter(width, height):
   return ((width + height)*2)
print(rectanglePerimeter(width, height))

Le faire fonctionner comme ceci produit:

% echo "1 2" | test.py
6

Je soupçonne qu'IDLE passe simplement une chaîne à votre script. La première input() consiste à extraire toute la chaîne. Remarquez ce qui se passe si vous insérez des instructions d'impression après les appels à input():

width = input()
print(width)
height = input()
print(height)

Exécuter echo "1 2" | test.py produit

1 2
Traceback (most recent call last):
  File "/home/unutbu/pybin/test.py", line 5, in <module>
    height = input()
EOFError: EOF when reading a line

Notez que la première instruction print imprime la chaîne entière '1 2'. Le deuxième appel à input() déclenche la EOFError (erreur de fin de fichier). 

Ainsi, un simple tuyau comme celui que j’ai utilisé ne vous permet de transmettre qu’une seule chaîne. Ainsi, vous ne pouvez appeler input() qu'une seule fois. Vous devez ensuite traiter cette chaîne, la diviser sur un espace et convertir les fragments de chaîne en vous-même. C'est quoi 

width, height = map(int, input().split())

est-ce que.

Notez qu'il existe d'autres moyens de passer des entrées à votre programme. Si vous aviez exécuté test.py dans un terminal, vous auriez pu taper 1 et 2 séparément sans aucun problème. Ou bien, vous auriez pu écrire un programme avec pexpect pour simuler un terminal, en passant 1 et 2 par programmation. Vous pouvez également utiliser argparse pour passer des arguments sur la ligne de commande, ce qui vous permet d’appeler votre programme avec

test.py 1 2
9
unutbu

convertissez vos entrées en ints:

width = int(input())
height = int(input())
0
astrognocci