同目录Python模块导入报错:ModuleNotFoundError: No module named 'odsrw'求助
问题描述
尝试将ods_extractor.py中的ODSFileExtractor类导入到main.py中,已在odsrw文件夹内创建__init__.py并导入该类,但运行main.py时出现错误:
ModuleNotFoundError: No module named 'odsrw'
相关代码
__init__.py代码:
from .ods_extractor import ODSFileExtractor __all__ = ['ODSFileExtractor',]
main.py代码:
from odsrw import ODSFileExtractor def main(): file_extractor = ODSFileExtractor() file_extractor.extract() if __name__ == '__main__': main()
文件结构
src └───odsrw │ main.py │ ods_extractor.py │ ods_reader.py │ __init__.py │ └───sqlite_data db_functions.py db_setup.py models.py __init__.py
问题原因与解决办法
核心问题
你运行main.py时,Python的当前工作目录是odsrw文件夹,而非src文件夹。此时用from odsrw import...的绝对导入方式,Python会在系统包目录或当前工作目录下寻找odsrw模块,但当前目录就是odsrw,自然找不到同名模块。
三种解决方式
方式1:改用相对导入并以包形式运行
修改main.py的导入语句为相对导入:
# main.py from .ods_extractor import ODSFileExtractor # 或者简化为 from . import ODSFileExtractor
注意:不能直接在odsrw目录下执行python main.py(Python禁止对主脚本使用相对导入),需要回到src目录,用包运行命令:
cd src python -m odsrw.main
方式2:手动添加src到Python模块路径
如果想直接在odsrw目录下运行main.py,在文件开头添加代码,把src目录加入Python的搜索路径:
# main.py 开头新增 import sys import os # 获取当前文件所在目录的上级目录(即src) src_dir = os.path.dirname(os.path.abspath(__file__)) sys.path.append(src_dir) # 保留原导入语句 from odsrw import ODSFileExtractor
之后直接在odsrw目录下执行python main.py即可。
方式3:调整文件结构(更规范)
把main.py移到src目录下,调整后结构如下:
src │ main.py └───odsrw │ ods_extractor.py │ ods_reader.py │ __init__.py │ └───sqlite_data ...
此时main.py的导入语句无需修改,回到src目录执行python main.py即可正常运行。
内容的提问来源于stack exchange,提问作者schwitzky
相关产品推荐
相关产品推荐

