V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
chunjie
V2EX  ›  问与答

请问 scrapy 部署到 Ubuntu 服务器上为何会出现 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 的错误?

  •  
  •   chunjie · 2018-08-05 08:25:26 +08:00 · 2139 次点击
    这是一个创建于 2083 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我把自己的一个 scrapy 项目部署到 Ubuntu16.04 服务器上,我自己的开发环境也是 Ubuntu16.04 ,在自己的开发环境上是没事的,我直接执行 scrapy crawl xxx 是可以的,但是我写了一个 py 文件来循环执行 scrapy crawl xxx 这个命令,我通过这个 py 文件来执行 scrapy 就出现 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)的错误了,而且我也加了 sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())这句还是不行,以下是我的这个 py 文件:

    # -*- coding: utf-8 -*-
    import os
    import multiprocessing
    import time
    import sys
    import codecs

    sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())
    print('中文')


    def start_spider_collect():
    # os.system('scrapy crawl xxx')
    # 获取 scrapy 的 spider 列表(获取命令行执行后的输出结果)
    while True:
    result = os.popen('scrapy list')
    res = result.read()
    for line in res.splitlines():
    if str(line).startswith('spider_collect'):
    print(line)
    print('sleep 10s')
    time.sleep(10)
    os.system('scrapy crawl ' + line)


    if __name__ == '__main__':
    multiprocessing.Process(target=start_spider_collect, name='process: start_spider_collect').start()

    请问这是怎么回事?
    6 条回复    2018-08-05 17:16:52 +08:00
    chunjie
        1
    chunjie  
    OP
       2018-08-05 08:46:56 +08:00
    我改成以下后可以了:

    # -*- coding: utf-8 -*-
    import os
    import multiprocessing
    import time
    import sys
    import codecs

    sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())
    print('中文')


    def start_spider_collect():
    while True:
    print('sleep 10s')
    time.sleep(10)
    os.system('scrapy crawl spider_collect_fengsheji')


    if __name__ == '__main__':
    multiprocessing.Process(target=start_spider_collect, name='process: start_spider_collect').start()

    但是妈呀,我发现执行这个文件 scrapy 启动后,好像杀掉进程也无法停下了。。。杀掉后过一阵子又会自动重启。。怎么回事?
    thinker3
        2
    thinker3  
       2018-08-05 09:06:32 +08:00
    python3
    yangyaofei
        3
    yangyaofei  
       2018-08-05 10:07:56 +08:00 via Android
    用 htop 看看进程树吧……你用你是另启动进程,在进程中执行启动,只杀子进程
    d5
        4
    d5  
       2018-08-05 10:29:40 +08:00
    pip3 install -r requirements.txt
    python3 xxx.py
    wsc449
        5
    wsc449  
       2018-08-05 11:40:01 +08:00
    再次设置启动编码识别

    reload(sys)
    sys.setdefaultencoding('utf-8')
    chunjie
        6
    chunjie  
    OP
       2018-08-05 17:16:52 +08:00
    @wsc449 这是 Python2 的方法吧,Python3 我执行 sys.setdefaultencoding('utf-8')这句都提示 sys 没有 setdefaultencoding 这个方法的,而且我执行 sys.getdefaultencoding()是输出 utf-8 的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3059 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:44 · PVG 22:44 · LAX 07:44 · JFK 10:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.