python - 导入 .pyd 文件时出现 UnicodeDecodeError

标签 python python-3.x

我开始慢慢涉足 Python/C API,经过大量摆弄和欺骗,我能够构建一个 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。我通过 mingw32 编译器编译了 spam.c。

感谢您阅读本文!

编辑:

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

这是一个常见问题吗?

这里是所有使用过的代码(如果有帮助的话):

<前>#include 静态 PyObject *spam_system(PyObject *self, PyObject *args) { const char *命令; int sts; if (!PyArg_ParseTuple(args, "s", &command)) 返回空值; sts = 系统(命令); 返回 Py_BuildValue("i", sts); } 静态 PyMethodDef SpamMethods[] = { {“系统”,spam_system,METH_VARARGS, “执行 shell 命令。”}, {空,空,0,空} }; 静态结构 PyModuleDef spammodule = { PyModuleDef_HEAD_INIT, “垃圾邮件”, 无效的, -1, 垃圾邮件方法 }; PyMODINIT_FUNC PyInit_spam(无效) { 返回 PyModule_Create(&spammodule); }

最佳答案

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

这极不可能。您发布的 C 源代码中没有可见的非 ASCII 字符。如果有的话,您会从 C 编译器收到一条错误消息(除非它在字符串常量中;我从未尝试过)。

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

这并不奇怪。记事本在前面添加了 UTF-8 BOM。这意味着您的 C 编译器会看到一个以 3 字节垃圾开头的源文件。不要使用记事本。使用适当的文本编辑器。

迹象表明问题更有可能出在您的 Python 输入中。 Python 3 中默认的源文件编码是 UTF-8。您的文件包含“字节 0x89”,它不是有效的 UTF-8 前导字节,Windows cp125X 编码将其映射到 别名 U+2030 PER MILLE SIGN - 或者将其放在字符串常量中或者您错误地输入了 %(百分号)。然而,很难猜测你是如何获得回溯的。进入解释器(例如 IDLE)并输入 import spam 不应给您回溯。

关于python - 导入 .pyd 文件时出现 UnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3536471/

相关文章:

python - 为什么这个正则表达式不匹配第二个二进制间隙?

python - shutil.move 在新名称包含冒号(和扩展名)时删除 Windows 上的文件

python - 如何将 Pandas 数据框中的边框添加到 html 表格行标题?

python - 使用 Python 从多个文件夹中提取所有文件

python-3.x - 每次运行神经网络代码时结果都会改变

python - 此类定义的 C++ 等价物是什么

python - 如何将json文件输出(子进程)加载到python中的变量中?

python - PyPac PyInstaller 无法访问互联网

python - 从终端运行脚本时出现 ModuleNotFoundError

python - 如何解决这个问题?运行时错误: dictionary changed size during iteration