Use the dis module to show the bytecode Python produces for a small function, and explain what that bytecode represents.
The dis module takes the compiled code object of any function, class, or code string and shows it in a readable form. That is the clearest way to show that Python really does compile before it interprets.
import dis
def add(a, b):
total = a + b
return total
dis.dis(add)
The output is a list of instructions, grouped by the line of source code they came from. In Python 3.12 you first see the start of the function. That is RESUME, then a LOAD_FAST for each parameter. After that comes the arithmetic, which is BINARY_OP with the add opcode, then STORE_FAST into total, then LOAD_FAST once more, and then RETURN_VALUE.
What that bytecode is, and what it is not, matters for the interview answer. It is not machine code for your processor. It is an intermediate form for the virtual machine inside CPython, and it does not depend on the kind of computer, in the same way that Java's bytecode does not. CPython saves it in the __pycache__ folder as a .pyc file, so a second run skips the compilation step completely.
Two more points make the answer strong. First, the compilation happens once for each code object, so the cost is paid per module and not per line. For a program that runs for a long time, that cost is not worth thinking about. Second, the bytecode is not a stable public contract. It is an implementation detail, and it changes between CPython versions, which is why nobody writes hand-made CPython bytecode in real projects.
So the precise answer is that Python compiles your source code to bytecode and then runs that bytecode on a virtual machine. Both halves of that sentence are worth saying out loud.