Python中如何从不同包导入类到当前包?带空格包名导入报错如何解决?
跨包导入操作的正确实现方案
问题根源
你遇到的报错核心有两个原因:
- Python的包名、模块名必须符合标识符命名规范,仅允许包含字母、数字、下划线,不能包含空格、特殊字符,你创建的
Classes in python包名带空格,本身就不符合Python的包命名规则 - 你写的
import classes in python.MyDate语句里包含空格,会被Python语法解析器识别为多个独立的标识符,直接触发语法错误
最优解决步骤
第一步:修正包命名
将带空格的Classes in python包重命名为下划线分隔的合法包名,比如classes_in_python,这是最省事、兼容性最高的方案,可以避免后续各种奇怪的导入问题。
第二步:配置项目路径
确保你的项目结构符合以下规范:
项目根目录/ ├── classes_in_python/ │ ├── __init__.py # 空文件即可,Python3.3+非强制但建议添加,明确标记为Python包 │ └── MyDate.py # 你的MyDate类定义在这个文件中 └── 独立调用包/ ├── __init__.py └── 调用代码文件.py
在PyCharm中右键点击项目根目录,依次选择Mark Directory as → Sources Root,PyCharm会自动将根目录加入Python模块搜索路径,避免找不到模块的报错。
第三步:正确编写导入语句
根据MyDate类的存放位置,选择对应的导入写法:
- 如果MyDate类定义在
classes_in_python/MyDate.py文件中:- 直接导入类:
from classes_in_python.MyDate import MyDate,使用时直接调用MyDate()即可 - 导入模块后调用:
import classes_in_python.MyDate as md,使用时调用md.MyDate()
- 直接导入类:
- 如果MyDate类直接定义在
classes_in_python/__init__.py中:- 直接写
from classes_in_python import MyDate即可
- 直接写
特殊临时方案(不推荐生产环境使用)
如果确实不想修改带空格的包名,可以用importlib模块动态导入:
import importlib # 动态导入带空格的包下的模块 mydate_module = importlib.import_module("Classes in python.MyDate") # 从模块中获取MyDate类 MyDate = getattr(mydate_module, "MyDate")
该写法可读性、兼容性都很差,仅作为临时测试使用,不建议正式项目中使用。
内容的提问来源于stack exchange,提问作者Arkadyuti Das
相关产品推荐
相关产品推荐

