在Raspberry Pi debian中启动脚本上的Python编码问题

时间:2015-12-08 21:46:13

标签: python-2.7 encoding raspberry-pi debian webiopi

所以我有一个运行Debian的Raspberry Pi和WebIOPi system。当我使用标准启动'$ sudo /etc/init.d/webiopi start'命令启动守护进程时运行正常但是自动启动不起作用'$ sudo update-rc.d webiopi defaults'。

日志表明它是Python中的编码问题,我的猜测python使用的是ascii,但脚本文件使用的是utf8。

为什么它能正常工作但不能自动启动,解决这个问题的好方法是什么?

2 个答案:

答案 0 :(得分:2)

要确认日志和您的怀疑,这是一个编码问题(字节与字符串最有可能)。即使您使用# -*- coding: utf-8 -*-将文件的编码设置为UTF-8,您仍然可以处理从一种形式更改为另一种形式的文本的问题。

字符串不是字符串,而是特定顺序的字节表示。 UTF-8提供了比ASCII可以处理的更多字符的编码,因此如果您尝试将存在于UTF-8编码字符串中的字符转换为ASCII编码字符串,那么您将收到错误,因为不存在此类编码

如果没有更多信息,例如代码和/或数据源,我无法给出更好的答案。

阅读https://docs.python.org/2/howto/unicode.html#the-unicode-type我们通过研究以下示例来学习:

>>> unicode('abcdef')
u'abcdef'
>>> s = unicode('abcdef')
>>> type(s)
<type 'unicode'>
>>> unicode('abcdef' + chr(255))    
Traceback (most recent call last):
...
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 6:
ordinal not in range(128)

文档还提到您可以选择通过替换或忽略它们来处理这些异常,如下所示:

>>> unicode('\x80abc', errors='strict')     
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0:
ordinal not in range(128)
>>> unicode('\x80abc', errors='replace')
u'\ufffdabc'
>>> unicode('\x80abc', errors='ignore')
u'abc'

注意1 :在Python 3中,情况发生了变化。为了编写与Python 3兼容的代码,我推荐以下内容:

https://docs.python.org/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

注意2 :值得注意的是,如果在尝试在控制台上显示字符串时遇到编码问题,则python有一个-u开关,可用于某些情况,例如当您通过CGI脚本提供二进制文件时,这将关闭字符串的缓冲,但这会打开另一种蠕虫。但是,尽管如此,在不调用-u的情况下模仿这种行为:

>>> print 'test'
'test'
>>> import os
>>> import sys
>>> sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
>>> print 'test'
test

答案 1 :(得分:0)

这真的取决于该计划。

但是,如果手动启动和作为系统启动的一部分之间存在差异,那么核心差异应该是环境变量。这通常用于例如//works fine cfg.For<IUserStore<ApplicationUser>>().Use<UserStore<ApplicationUser>>(); //does NOT work cfg.For<IRoleStore<IdentityRole>>().Use<RoleStore<IdentityRole>>();

此处有两个选项 - 您的区域设置未设置,或脚本最终使用不同版本的 python

对于前面的内容,请考虑在此脚本或全局环境中为所有启动任务添加inittab(精确)或需要LANG(锤子)。

您可以通过比较这两个调用来手动尝试:

LC_ALL

VS

sudo LC_ALL=en_US.UTF-8 /etc/init.d/webiopi start

对于后者,请尝试将sudo LC_ALL=C /etc/init.d/webiopi start 更改为仅包含部分PATH