Python 3.6跨文件导入类时出现ModuleNotFoundError问题咨询
解决Python导入Article类时的ModuleNotFoundError问题
嘿,我来帮你排查这个导入错误的问题!虽然你提到用Django开发,但代码里用到了Scrapy的Item类,不过不管是Scrapy还是Django项目,Python模块导入的核心逻辑是一致的,咱们从几个常见的方向来排查:
1. 检查文件结构与导入路径是否匹配
首先得确认你的文件层级,举个典型的Scrapy项目结构例子:
your_scrapy_project/ ├── your_scrapy_project/ │ ├── __init__.py │ ├── items.py # 这里定义了Article类 │ └── spiders/ │ ├── __init__.py │ └── my_spider.py # 这里是你写第二个类的文件
如果是在my_spider.py里导入Article,要根据层级用正确的导入方式:
- 绝对导入(推荐,更清晰):
from your_scrapy_project.items import Article - 相对导入(适用于包内部的模块):
from ..items import Article
如果两个文件在同一目录下,直接写from items import Article就可以,但要保证这个目录在Python的可搜索路径里。
2. 确认目录已被标记为Python包
Python需要识别你的目录为可导入的包,虽然Python3.3+支持无__init__.py的命名空间包,但有些旧环境或者框架(比如Scrapy)还是依赖这个文件。如果你的代码目录里没有__init__.py,创建一个空的就行,它不需要写任何代码,只是告诉Python“这是一个包”。
3. 检查项目根目录是否在Python的搜索路径中
有时候你运行脚本的位置不对,导致Python找不到你的模块。可以在第二个类的文件开头加几行代码排查:
import sys print(sys.path)
如果输出里看不到你的项目根目录,就手动把它添加到路径里:
import sys from pathlib import Path # 根据你的文件层级调整parent的数量,比如这里是回到项目根目录 sys.path.append(str(Path(__file__).parent.parent))
另外,尽量在项目根目录下运行你的爬虫/脚本,比如用scrapy crawl your_spider,而不是进入spiders目录再执行。
4. 检查拼写是否正确
Python是大小写敏感的,一定要确认导入语句里的文件名、类名没有拼写错误:
- 比如是不是把
items写成了item? - 是不是把
Article写成了article?
这些小细节很容易出错,仔细核对一下!
内容的提问来源于stack exchange,提问作者user8665559




