导入.pyd文件时出现UnicodeDecodeError

时间:2010-08-21 05:29:18

标签: python python-3.x

我已经开始慢慢涉足Python / C API,经过大量的讨论和讨论后,我能够构建一个spam.pyd文件。

但是,我必须错过这个过程,并希望有人能指出我正确的方向。我认为一旦spam.pyd被创建,我可以通过导入垃圾邮件从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。我通过mingw32编译器编译spam.c。

感谢您阅读本文!

编辑:

好吧,看起来问题是我在编辑器中编写了C代码,用ANSI编码保存了文件。奇怪的是,如果我在记事本中重新输入代码,并使用UTF8编码保存文件,我会收到抱怨无效字符的编译时错误。当我使用内置的IDLE编辑器时,一切正常。我只是关注Python教程here中的示例。

这是一个常见的问题吗?

以下是有用的所有代码:

#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);
}

#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 个答案:

答案 0 :(得分:2)

你说:好吧,看起来问题是我在编辑器中编写了C代码,用ANSI编码保存了文件。

这极不可能。您发布的C源中没有可见的非ASCII字符。如果有的话,你会得到一个来自C编译器的错误消息(除非它是一个字符串常量;我从来没有尝试过)。

你说:奇怪的是,如果我在记事本中重新输入代码,并使用UTF8编码保存文件,我会收到抱怨无效字符的编译时错误。

并不奇怪。记事本预装了UTF-8 BOM。这意味着您的C编译器将显示一个源自3个字节垃圾的源文件。不要使用记事本。使用正确的文本编辑器。

有迹象表明问题更可能出现在Python输入中。 Python 3中的默认源文件编码是UTF-8。您的文件包含“字节0x89”,它不是有效的UTF-8引导字节,Windows cp125X编码映射到别名U + 2030 PER MILLE SIGN - 要么是字符串常量,要么是'我错误地输入%(PER CENT SIGN)。然而,你很难猜到你是如何得到你所做的追溯的。进入口译员(例如IDLE)并输入import spam不应该给你回溯。