关于直接运行分布式爬虫文件出现的异常

再通过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

  

posted @ 2019-01-23 09:51  瓜田月夜  阅读(1172)  评论(2)    收藏  举报