2010-08-21 64 views
1

我已經開始慢慢涉足Python/C API,並且經過大量的擺弄和討論後,我能夠構建spam.pyd文件。導入.pyd文件時的UnicodeDecodeError

但是,我必須在這個過程中失去一些東西,並希望有人能指出我在正確的方向。我認爲一旦創建了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。

感謝您閱讀本文!

編輯:

嗯,它看起來像問題是,我已經在使用ANSI編碼保存文件的編輯器編寫的C代碼。奇怪的是,如果我在記事本中重新輸入了代碼,並且使用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); 
} 

+0

那麼,你最好向我們展示spam.c的[相關部分]來源。這是你用C編寫的第一個Python擴展模塊嗎?你正在學什麼教科書或教程? – 2010-08-21 06:06:07

+0

是的,這是我第一次編寫Python擴展模塊。我只是按照Python網站上的教程。我用更多(有希望的)相關信息更新了我的問題。 – 2010-08-21 19:50:46

回答

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不應該給你那個回溯。

+0

+1感謝您的解釋。我試着將代碼保存在一個非常舊的microsoft visual studio版本中,並得到了相同的回溯(文件編譯得很好),所以對我來說仍然有點神祕。當轉向更好的編輯時,這些問題確實消失了。 – 2010-08-26 00:24:41

相關問題