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

2018-08-05 08:25:26 +08:00
 chunjie
我把自己的一个 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()

请问这是怎么回事?
2148 次点击
所在节点    问与答
6 条回复
chunjie
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
2018-08-05 09:06:32 +08:00
python3
yangyaofei
2018-08-05 10:07:56 +08:00
用 htop 看看进程树吧……你用你是另启动进程,在进程中执行启动,只杀子进程
d5
2018-08-05 10:29:40 +08:00
pip3 install -r requirements.txt
python3 xxx.py
wsc449
2018-08-05 11:40:01 +08:00
再次设置启动编码识别

reload(sys)
sys.setdefaultencoding('utf-8')
chunjie
2018-08-05 17:16:52 +08:00
@wsc449 这是 Python2 的方法吧,Python3 我执行 sys.setdefaultencoding('utf-8')这句都提示 sys 没有 setdefaultencoding 这个方法的,而且我执行 sys.getdefaultencoding()是输出 utf-8 的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/476955

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX