导入.pyd文件时出现UnicodeDecodeError

1 投票
1 回答
1757 浏览
提问于 2025-04-16 03:06

我开始慢慢尝试使用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 个回答

2

你说:看起来问题在于我在一个编辑器中写的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,应该不会出现那个错误追踪。

撰写回答