[Tutor] module import from a packager works inconsistent between REPL and command line

Arup Rakshit ar at zeit.io
Thu Apr 25 08:10:18 EDT 2019


I have a small app like this:

pizza-shop$ tree .
.
└── pizzapy
    ├── __init__.py
    ├── menu.py
    └── pizza.py

1 directory, 3 files

# menu.py 

from typing import List
from pizza import Pizza

MENU: List[Pizza] = [
    Pizza('Margherita', 30, 10.0),
    Pizza('Carbonara', 45, 14.99),
    Pizza('Marinara', 35, 16.99),
]

if __name__ == '__main__':
    print(MENU)

# pizza.py 

import math

class Pizza:
    name: str = ''
    size: int = 0
    price: float = 0
    
    def __init__(self, name: str, size: int, price: float) -> None:
        self.name = name
        self.size = size
        self.price = price
    
    def area(self) -> float:
        return math.pi * math.pow(self.size / 2, 2)

    def awesomeness(self) -> int:
        if self.name == 'Carbonara':
            return 9000

        return self.size // int(self.price) * 100

print('pizza.py module name is %s' % __name__)

if __name__ == '__main__':
    print('Carbonara is the most awesome pizza.')


Now when I call the menu.py from command like it works as expected.

pizza-shop$ python3 pizzapy/menu.py 
pizza.py module name is pizza
[<pizza.Pizza object at 0x1035dbeb8>, <pizza.Pizza object at 0x1035fb2b0>, <pizza.Pizza object at 0x1036b6c50>]

But it fails in REPL:

pizza-shop$ python3
Python 3.7.3 (default, Mar 27 2019, 09:23:15) 
[Clang 10.0.1 (clang-1001.0.46.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from  pizzapy import menu
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/aruprakshit/python_playground/pizza-shop/pizzapy/menu.py", line 2, in <module>
    from pizza import Pizza
ModuleNotFoundError: No module named 'pizza'
>>> 


What is the reason of this inconsistency ?


Thanks,

Arup Rakshit
ar at zeit.io





More information about the Tutor mailing list