关于直接运行分布式爬虫文件出现的异常
再通过runspider命令运行一个爬虫时出现了这样一个异常, 说是在尝试在没有父包的情况下进行相对导入
runspider: error: Unable to load "xxx.py" : attempted relative import with no parent package
这是在我通过相对导入items包时出现的异常, 这个异常在我没有使用scrapy_redis时并没有出现. 后来我在导入前和导入后打印了提示信息, 发现会打印两次, 第一次导入成功是没有问题的,第二次就导入失败了.
from ..items import RedisChoutiItem # 异常行
后来我在网上找到一些资料, 在导入包前添加了一行打印, 分别是文件名路径, 模块名, 所属包名
print('__file__={} | __name__={} | __package__={}'.format(__file__,__name__,str(__package__)))
得到结果
__file__= | __name__=redis_chouti.spiders.chouti_detail | __package__=re dis_chouti.spiders __file__= | __name__=chouti_detail | __package__=
这里的文件名是一样的, 可以看到第一次导入是正常的, __name__可以看到执行的就是这个项目目录下的一个文件. 而第二次就出现问题了, __name__执行的就是那个爬虫文件, 他是没有上级的, 所以通过..导入就失败了.
解决方案: 把上级的那个文件加入到sys.path中
sys.path.append(os.path.dirname(os.path.dirname(__file__))) # 或者使用insert放到最开始 import items
异常产生的原因
有如下目录文件
--file -- aa --test1.py --test2.py -- test.py # 文件内容 # test.py print("aaaa") # test1.py print(__name__, __package__) from .. import test # test2.py import test1
当直接执行test1.py时, 异常信息如下: 试图在顶级包之外进行相对导入
__main__ None ValueError: attempted relative import beyond top-level package
当直接执行test2.py时, 异常信息如下: 尝试在没有已知父包的情况下进行相对导入
test1 ImportError: attempted relative import with no known parent package