Python 3 ModuleNotFoundError: нет модуля с именем 'lot' - PullRequest
2 голосов
/ 11 июня 2019

Я пытаюсь запустить скрипт модульного теста python3, но он выдает ошибку «модуль не найден», когда он использует объекты из основного скрипта и встречает операторы импорта.Я не сталкиваюсь с этой ошибкой, когда запускаю основной сценарий и код выполняется так, как ожидалось.Я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "parkingLot_test.py", line 3, in <module>
    from source import parking  
  File "/home/stash/Desktop/parking-lot/parking-lot-1.4.2/parking_lot/parking_lot/bin/source/parking.py", line 1, in <module>
    import lot

ModuleNotFoundError: No module named 'lot'

Структура каталогов выглядит следующим образом:

├── file_inputs.txt
├── parking_lot
├── parkingLot_test.py
├── run_functional_tests
├── setup
└── source
    ├── car.py
    ├── __init__.py
    ├── lot.py
    ├── main.py
    ├── parking.py

Код файла модульного теста parkingLot_test.py :

import unittest
from source import parking  

class ParkingTest(unittest.TestCase):

    @classmethod
    def MakeClass(cls):
        cls.parking = parking.Parking()
        cls.allocated_slot = 1

    def test_a_create_parking_lot(self):
        parking_slots = 6
        self.parking.create_parking_lot(parking_slots)
        self.assertEqual(len(self.parking.slots), parking_slots,
                         msg="Wrong parking lot created")

    def test_b_park(self):
        registration_no = "MH-12-FF-2017"
        colour = "Black"
        self.parking.park(registration_no, colour)
        self.assertFalse(
            self.parking.slots[self.allocated_slot].available, "Park failed.")
        for i in self.parking.slots.values():
            if not i.available and i.car:
                self.assertEqual(i.car.registration_no,
                                 registration_no, "Park failed")
                self.assertEqual(i.car.colour, colour, "Park failed")

    def test_c_leave(self):
        self.parking.leave(self.allocated_slot)
        self.assertTrue(
            self.parking.slots[self.allocated_slot].available, "Leave failed.")

    @classmethod
    def RemoveClass(cls):
        del cls.parking


if __name__ == '__main__':
    unittest.main()

Код для импортированного файла parking.py :

import lot
import car


class Parking:
    """
    Parking class which has details about parking slots
    as well as operation performed on parking are present here
    """

    def __init__(self):
        self.slots = {}

    def create_parking_lot(self, no_of_slots):
        """This method will create parking lot if not present already with given
        number of slots.
        Input: no_of_slots - Integer Type
        """
        no_of_slots = int(no_of_slots)

        if len(self.slots) > 0:
            print("Parking Lot already created")
            return

        if no_of_slots > 0:
            for i in range(1, no_of_slots+1):
                temp_slot = lot.ParkingSlot(slotNum=i,
                                            availability=True)

                self.slots[i] = temp_slot
            print("Created a parking lot with %s slots" % no_of_slots)
        else:
            print("Number of slots provided is incorrect.")
        return

    def get_nearest_available_slot(self):
  ...................

Как я могу решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Поскольку python 3 не поддерживает неявный относительный импорт.Вы можете использовать явный относительный импорт.

Попробуйте использовать следующую строку вместо лот импорта в parking.py

from . import lot

1 голос
/ 11 июня 2019

в том же файле уровня каталога, когда вы импортируете один файл в другой, используйте относительный импорт как

в parking.py файл импортирует lot.py файл как

import .log

и при импорте из одного каталога в нижний каталог, т.е. при импорте лота в parkingLot_test.py, используйте from source import lot

и в исходной папке в __init__.py файл записать

import .lot
import .parking

как это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...