On Sat, Nov 17, 2007 at 10:38:27AM +0300, Anton Farygin wrote: > Мне кажется, что достаточно было бы вывести вменяемую диагностику. По > крайней мере в моём случае. Я сделал вменяемую диагностику, насколько это возможно. $ hsh --init .. rpm-build-python-0.32-alt1 ... $ hsh-shell $$ cd $$ echo '# coding: utf8' >test.py $$ /usr/lib/rpm/python.req test.py python.req: test.py: non-standard encoding: utf8 python2.4(encodings) python.req: ERROR: test.py: python.req: maybe you need python-modules-encodings Traceback (most recent call last): File "/usr/lib/rpm/python.req.py", line 178, in ? import encodings ImportError: No module named encodings $$ Вообще-то MemoryError в данном случае -- это питоновский баг http://bugs.python.org/issue979739 > > Думаю, захачить на эту тему python-base или нет. То есть чтобы он > > понимал побольше настандартных алиасов для стандартных кодировок, > > без заглядывания в encodings. > > Если нестантартные алиасы являются стандартом де-факто (т.е. - > значительно распространены), то видимо стоит хачить питон. В обратном > случаае - выводить вменяемую диагностику и патчить приложения. Посмотрим, насколько они распространены. Parser/tokenizer.c: 183 static char * 184 get_normal_name(char *s) /* for utf-8 and latin-1 */ 185 { 186 char buf[13]; 187 int i; 188 for (i = 0; i < 12; i++) { 189 int c = s[i]; 190 if (c == '\0') break; 191 else if (c == '_') buf[i] = '-'; 192 else buf[i] = tolower(c); 193 } 194 buf[i] = '\0'; 195 if (i > 3) { /* at least 4 characters */ 196 const char *p = NULL; 197 switch (buf[0]) { 198 case 'u': 199 if (strncmp(buf, "utf-8", 5) == 0) 200 p = buf + 5; 201 else if (strncmp(buf, "utf8", 4) == 0) 202 p = buf + 4; 203 if (p && (*p == '\0' || *p == '-')) 204 return "utf-8"; 205 break; 206 case 'i': 207 if (strncmp(buf, "utf-8") == 0) 208 p = buf + 5; 209 210 211 212 if (strcmp(buf, "utf-8") == 0 || 213 strncmp(buf, "utf-8-", 6) == 0) return "utf-8"; 214 else if (strcmp(buf, "latin-1") == 0 || 215 strcmp(buf, "iso-8859-1") == 0 || 216 strcmp(buf, "iso-latin-1") == 0 || 217 strncmp(buf, "latin-1-", 8) == 0 || 218 strncmp(buf, "iso-8859-1-", 11) == 0 || 219 strncmp(buf, "iso-latin-1-", 12) == 0) return "iso-8859-1"; 220 else return s;gg 221 } То есть у питона есть две стандартные кодировки, для которых почти ничего не нужно -- utf-8 и iso-8859-1. Но в модуле encodings определяются дополнительные алиасы, в том числе для стандартных кодировок. Lib/encodings/aliases.py: 395 # latin_1 codec 396 '8859' : 'latin_1', 397 'cp819' : 'latin_1', 398 'csisolatin1' : 'latin_1', 399 'ibm819' : 'latin_1', 400 'iso8859' : 'latin_1', 401 'iso_8859_1' : 'latin_1', 402 'iso_8859_1_1987' : 'latin_1', 403 'iso_ir_100' : 'latin_1', 404 'l1' : 'latin_1', 405 'latin' : 'latin_1', 406 'latin1' : 'latin_1', ... 486 # utf_8 codec 487 'u8' : 'utf_8', 488 'utf' : 'utf_8', 489 'utf8' : 'utf_8', 490 'utf8_ucs2' : 'utf_8', 491 'utf8_ucs4' : 'utf_8', Есть искушение внести некоторые из этих алисов в Parser/tokenizer.c, чтобы уменьшить число падений при отсутствии encodings/aliases.py. Посмотрим, что будет по результатам пересборки с новым rpm-build-python. Потому что теперь в python.req.py будет диагностика "non-standard encoding:", которая мимикрирует проверку в Parser/tokenizer.c.