EOFError: EOF when reading a line

python, python-3.x

Solution

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

Running it like this produces:

% echo "1 2" | test.py
6

I suspect IDLE is simply passing a single string to your script. The first `input()` is slurping the entire string. Notice what happens if you put some print statements in after the calls to `input()`:

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

Running `echo "1 2" | test.py` produces

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

Notice the first print statement prints the entire string `'1 2'`. The second call to `input()` raises the `EOFError` (end-of-file error).

So a simple pipe such as the one I used only allows you to pass one string. Thus you can only call `input()` once. You must then process this string, split it on whitespace, and convert the string fragments to ints yourself. That is what

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

does.

Note, there are other ways to pass input to your program. If you had run `test.py` in a terminal, then you could have typed `1` and `2` separately with no problem. Or, you could have written a program with pexpect to simulate a terminal, passing `1` and `2` programmatically. Or, you could use argparse to pass arguments on the command line, allowing you to call your program with

test.py 1 2

Problem

I am trying to define a function to make the perimeter of a rectangle. Here is the code: ``` width = input() height = input() def rectanglePerimeter(width, height): return ((width + height)*2) print(rectanglePerimeter(width, height)) ``` I think I haven't left any arguments opened or anything like that.

Original source

Related problems