Import Error: No Module named 'BluePrints'

Import Error: No Module named 'BluePrints'

我正在学习 Python 一个夏天 class,并且遇到了这个错误:在下面的代码中你会看到我有一个包,我加载到 [=32] =],我将其用作我的主文件。但是明明在目录里却少了BluePrints.py。我也检查过无数次输入错误,但这不是问题所在。我正在学习的书中没有关于这个问题的文档,none 我可以在 Python 在线文档中看到,并且在 Whosebug 上找不到这个特定问题。这是我的代码:

# Director.py
from Builder import HouseBuilders as hb, HouseBuilderInterface as hbi 

interface = hbi.HouseBuilderInterface()   # An interface to my concrete builders
first_house = hb.EarthHomeBuilder()   # Initialize a concrete builder

interface.build_room(first_house, 'kitchen')  # Build a room in the Earth House

Builder/HouseBuilderInterface.py

class HouseBuilderInterface():

    """ HouseBuilder utilizes Python's duck-typing to provide an interface to the concrete house builders"""
    def build_room(obj, room_type):     # Rooms are an attribute shared by all houses
        obj.build_room(room_type)
    
    def build_wall(obj, room1, room2):  # Walls are an attribute shared by all houses; Duplex's will have a unique Dividing Wall
        obj.build_wall(room1, room2)
        
    def build_window(obj, wall):        # Windows are an attribute shared by all houses
        obj.build_window(wall)
        
    def build_door(obj):                # Doors are an attribute shared by all houses; Colonial and Split-level houses can have basement doors
        obj.build_door()
        
    def build_stairs(obj):              # Stairs can only be built in Colonial and Split-level houses; Colonial stair cases are bigger
        obj.build_stairs()
        
    def build_extra(obj):               # Some houses have extra features: Earth-homes have plants on the roof, Single-story has a wrap-around-porch, etc.
        obj.build_extra()

Builder/HouseBuilders.py

import BluePrints

class EarthHomeBuilder():

    def __init__(self):     # Initialize a simple house
        self.room_no = 0
        self.window_no = 0
        self.door_no = 1
        self.wall_no = 4
        self.key = 0                # key attribute is a unique key for the dictionary
        self.house_features = {}
        
    def build_room(self, room_type):
        new_room = BluePrints.Room(room_type)
        self.room_no += 1
        self.house_features[key] = room_type + ''
        self.key += 1

Builder/BluePrints.py

class Room():
    """ Defines a room object with an attribute of room_type"""
    def __init__(self, room_type):
        self.room_type = room_type
        
class Wall():
    """ Defines a Wall object with attributes of window and door """
    def __init__(self):     # Initialize windows & doors to 0 
        self.windows = 0
        self.doors = 0
        
    def add_window(self):
        self.windows += 1
        
    def add_door(self):
        self.doors += 1
        
class Window():
    """ Defines a Window object with no attributes; Adds a window to specified Wall object"""
    def __init__(wall_location):
        wall_location.add_window()      # Use duck-typing to call Wall method add_window()
        
class Door():
    """ Defines a Door object with no attributes; Adds a door to specified Wall object """
    def __init__(wall_location):
        wall_location.add_door()        # Use duck-typing to call Wall method add_door()
        
class StairCase():
    """ Defines a StairCase object with an attribute of length """
    def __init__(self, length):
        self.length = length
        
class ExtraFeature():
    """ Defines an ExtraFeature object which is unique type of house feature specific to each house """
    def __init__(self, extra_feature):
        self.extra_feature = extra_feature

注意:此作业是 Builder 软件模式的实现。另外,我只测试了 build_room 方法,如 Director.py 文件中所示。我不关心任何错误,除非它们与导入问题有关 BluePrints.py 确切的错误消息是 ImportError: no module named 'BluePrints'

编辑:

我正在使用 Python3.4

问题是,在您将 HouseBuilders 导入 Director.py 之后,sys.path 仍然保留在 Director.py 的目录中,因此没有BluePrints.py 直接在 sys.path.

指定的任何目录中

并且 python 在尝试查找要导入的包或 class 时查找的是 sys.path。另外我猜你正在使用 Python 3.x .

解决方法是按照 documentation 所说的 -

6.4.2. Intra-package References

When packages are structured into subpackages (as with the sound package in the example), you can use absolute imports to refer to submodules of siblings packages. For example, if the module sound.filters.vocoder needs to use the echo module in the sound.effects package, it can use from sound.effects import echo.

所以在 Builder/HouseBuilders.py 中,将导入语句更改为 -

from Builder import BluePrints