导入.pyd文件时出现UnicodeDecodeError
我开始慢慢尝试使用Python/C的接口,经过一番折腾,我终于成功创建了一个叫spam.pyd的文件。
不过,我觉得这个过程可能还有些地方没搞明白,希望有人能给我指点一下。我原以为一旦创建了spam.pyd,就可以通过import spam在Python中调用它。这是真的吗?
但是当我尝试这样做时,出现了以下错误信息:
Traceback (most recent call last):
File "< pyshell#25 >", line 1, in <module>
import spam
UnicodeDecodeError: 'utf8' codec can't decode byte 0x89 in position 1: unexpected code byte
我到底哪里出错了呢?我是在Windows XP上使用Python 3.1.2进行操作的,spam.c是通过mingw32编译器编译的。
谢谢你们阅读我的问题!
编辑:
看起来问题出在我用的编辑器,它把文件保存成了ANSI编码。奇怪的是,如果我在记事本中重新输入代码,并用UTF8编码保存,就会出现编译时的错误,提示有无效字符。而当我使用内置的IDLE编辑器时,一切都正常。我只是按照Python教程中的例子在做,链接在这里。
这算是常见的问题吗?
如果有帮助的话,这里是我用的所有代码:
#include < Python.h >
static PyObject *spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return Py_BuildValue("i", sts);
}
static PyMethodDef SpamMethods[] = {
{"system", spam_system, METH_VARARGS,
"Execute a shell command."},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef spammodule = {
PyModuleDef_HEAD_INIT,
"spam",
NULL,
-1,
SpamMethods
};
PyMODINIT_FUNC
PyInit_spam(void)
{
return PyModule_Create(&spammodule);
}
1 个回答
你说:看起来问题在于我在一个编辑器中写的C代码,它把文件保存成了ANSI编码。
这几乎不可能。你发布的C源代码中没有看到任何非ASCII字符。如果有的话,你应该会从C编译器那里收到错误信息(当然,如果是在字符串常量中,可能就不会了;我没试过这种情况)。
你说:奇怪的是,如果我在记事本中重新输入代码,并用UTF8编码保存文件,我会收到编译时错误,提示有无效字符。
这并不奇怪。记事本会在文件开头加上一个UTF-8的BOM。这意味着你的C编译器看到的源文件开头有3个无用的字节。别用记事本,应该用一个合适的文本编辑器。
看起来问题更可能出在你的Python输入上。Python 3的默认源文件编码是UTF-8。你的文件中包含“字节0x89”,这是一个无效的UTF-8起始字节,而Windows的cp125X编码把它映射成‰
,也就是U+2030千分号——要么你在字符串常量中有这个,要么你错误地输入了它,原本是想输入%
(百分号)。不过,猜测你得到那个错误追踪的原因还是挺难的。进入一个解释器(比如IDLE)并输入import spam
,应该不会出现那个错误追踪。