所以我有一个运行Debian的Raspberry Pi和WebIOPi system . 当我使用标准启动'$ sudo /etc/init.d/webiopi start'命令启动守护进程时运行正常但是自动启动不起作用'$ sudo update-rc.d webiopi defaults' .
日志表明它是Python中的编码问题,我的猜测python使用的是ascii,但脚本文件使用的是utf8 .
为什么它能正常工作但不能自动启动,解决这个问题的好方法是什么?
所以我有一个运行Debian的Raspberry Pi和WebIOPi system . 当我使用标准启动'$ sudo /etc/init.d/webiopi start'命令启动守护进程时运行正常但是自动启动不起作用'$ sudo update-rc.d webiopi defaults' .
日志表明它是Python中的编码问题,我的猜测python使用的是ascii,但脚本文件使用的是utf8 .
为什么它能正常工作但不能自动启动,解决这个问题的好方法是什么?
2 回答
要确认日志和您的怀疑,这是一个编码问题(字节与字符串最有可能) . 即使您使用
# -*- coding: utf-8 -*-
将文件的编码设置为UTF-8,您仍然可以处理从一种形式更改为另一种形式的文本的问题 .字符串不是字符串,而是特定顺序的字节表示 . UTF-8提供比ASCII可以处理的更多字符的编码,因此如果您尝试将存在于UTF-8编码字符串中的字符转换为ASCII编码字符串,那么您将收到错误,因为不存在此类编码 .
没有更多信息,例如代码和/或数据源,我无法给出更好的答案 .
阅读https://docs.python.org/2/howto/unicode.html#the-unicode-type我们通过研究以下示例来学习:
文档还提到您可以通过替换或忽略它们来选择处理这些异常,如下所示:
NOTE 1 :在Python 3中,事情发生了变化 . 为了编写与Python 3兼容的代码,我推荐以下内容:
https://docs.python.org/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit
NOTE 2 :还值得注意的是,如果在尝试在控制台上显示字符串时遇到编码问题,则python有一个
-u
开关,可以在某些情况下使用,例如当您通过CGI提供二进制文件时脚本,它将关闭字符串的缓冲,但这会打开另一种蠕虫 . 但是,尽管如此,在不调用-u
的情况下模仿这种行为:这真的取决于该计划 .
但是,如果手动启动它和作为系统启动的一部分之间存在差异,则核心差异应该在 environment variables 中 . 这通常用于例如
inittab
.这里有两个选项 - 您的 locale 未设置,或脚本最终使用不同版本的 python .
对于前面的内容,请考虑将
LANG
(精确)或者如果需要LC_ALL
(锤子)添加到此脚本或全局环境中以执行所有启动任务 .您可以通过比较这两个调用来手动尝试:
与
对于后者,尝试将
PATH
更改为仅包含一些/bin:/usr/bin:/usr/local/bin