Я начал медленно баловаться с 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);
}
Вы скажете: Что ж, похоже, проблема заключалась в том, что я написал код 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
НЕ должны давать вам эту трассировку.