EOFError: EOF при чтении строки

Я пытаюсь определить функцию для создания периметра прямоугольника. Вот код:

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

Я думаю, что я не оставил никаких аргументов открытым или что-то в этом роде.

Ответ 1

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

Запуск таким образом:

% echo "1 2" | test.py
6

Я подозреваю, что IDLE просто передает одну строку в ваш script. Первая input() - это сплошная строка. Обратите внимание, что произойдет, если вы поместите некоторые заявления печати после вызовов input():

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

Запуск echo "1 2" | test.py создает

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

Обратите внимание, что первый оператор печати печатает всю строку '1 2'. Второй вызов input() вызывает ошибку EOFError (ошибка конца файла).

Таким образом, простой канал, такой как тот, который я использовал, позволяет передавать только одну строку. Таким образом, вы можете только один раз вызвать input(). Затем вы должны обработать эту строку, разбить ее на пробелы и преобразовать фрагменты строки в ints самостоятельно. Это то, что

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

делает.

Обратите внимание, что есть другие способы передачи ввода в вашу программу. Если вы запустили test.py в терминале, вы могли бы написать 1 и 2 отдельно без проблем. Или вы могли бы написать программу с pexpect для имитации терминала, передавая программные файлы 1 и 2. Или вы можете использовать argparse для передачи аргументов в командной строке, что позволяет вам вызвать вашу программу с помощью

test.py 1 2

Ответ 2

преобразуйте свои входы в ints:

width = int(input())
height = int(input())

Ответ 3

** Лучше всего использовать try, кроме block, чтобы избавиться от EOF **

try:
    width = input()
    height = input()
    def rectanglePerimeter(width, height):
       return ((width + height)*2)
    print(rectanglePerimeter(width, height))
except EOFError as e:
    print(end="")