UnicodeDecodeError при импорте файла .pyd

Я начал медленно баловаться с API Python / C, и после долгих потрясений и недоразумений я смог создать файл spam.pyd.

Однако я, должно быть, что-то упустил в этом процессе и надеялся, что кто-то может указать мне правильное направление. Я думал, что после того, как spam.pyd был создан, я мог вызвать его из Python через импорт спама. Это правда?

Когда я пытаюсь это сделать, я получаю следующий след:

Traceback (most recent call last):

  File "< pyshell#25 >", line 1, in 

    import spam

UnicodeDecodeError: 'utf8' codec can't decode byte 0x89 in position 1: unexpected code byte

Есть какие-нибудь идеи относительно того, что я делаю неправильно? Я работаю с Python 3.1.2 на Windows XP. Я скомпилировал spam.c с помощью компилятора mingw32.

Спасибо за чтение!

РЕДАКТИРОВАТЬ:

Что ж, похоже, проблема заключалась в том, что я написал код C в редакторе, который сохранил файл с ANSI кодирование. Странно, если бы я повторно набрал код в Блокноте и сохранил файл с кодировкой UTF8, я получил бы ошибки времени компиляции с жалобами на недопустимые символы. Когда я использовал встроенный редактор IDLE, все работало нормально. Я просто следовал примеру из учебника по Python здесь .

Это обычная проблема, чтобы иметь ??

Вот весь код, который использовался, если он помогает любому: и сохранив файл с кодировкой UTF8, я получу ошибки времени компиляции с жалобами на недопустимые символы. Когда я использовал встроенный редактор IDLE, все работало нормально. Я просто следовал примеру из учебника по Python здесь .

Это обычная проблема, чтобы иметь ??

Вот весь код, который использовался, если он помогает любому: и сохранив файл с кодировкой 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
задан B Rivera 21 August 2010 в 19:28
поделиться

1 ответ

Вы скажете: Что ж, похоже, проблема заключалась в том, что я написал код C в редакторе, который сохранил файл в кодировке ANSI.

Это крайне маловероятно. В опубликованном исходном коде C нет видимых символов, отличных от ASCII.Если бы они были, вы бы получили сообщение об ошибке от компилятора C (за исключением, может быть, строковой константы; я никогда этого не пробовал).

Вы скажете: Как ни странно, если бы я повторно набрал код в Блокноте и сохранил файл с кодировкой UTF8, я бы получил ошибки времени компиляции с жалобами на недопустимые символы.

Как ни странно. Блокнот добавляет спецификацию UTF-8. Это означает, что вашему компилятору C был представлен исходный файл, который начинался с 3 байтов мусора. Не используйте Блокнот. Используйте подходящий текстовый редактор.

Есть признаки того, что проблема, скорее всего, кроется в вашем вводе Python. Кодировка исходного файла по умолчанию в Python 3 - UTF-8. Ваш файл содержит «байт 0x89», который не является допустимым старшим байтом UTF-8 и который кодирование Windows cp125X сопоставляет с псевдонимом U + 2030 PER MILLE SIGN - либо оно есть в строковой константе, либо вы ввели это по ошибке для % (ПРОЦЕНТ ЗНАКА). Однако трудно догадаться, как вы получили обратную связь, которую вы сделали. Попадание в интерпретатор (например, IDLE) и ввод import spam НЕ должны давать вам эту трассировку.

2
ответ дан 2 September 2019 в 21:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: