我已经开始慢慢涉足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);
}
答案 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
不应该给你回溯。