2010-07-27 3 views
3

Я пытаюсь установить эту библиотеку для LZJB сжатия. PyLZJB LINKНеверный класс ELF - Python

Библиотека является обязательным для библиотеки C, файл находится здесь PyLZJB.so


К сожалению, скопировав в каталог сайтов-пакетов, когда импорт я получаю ошибку «Неправильный класс ELF» ,

>>> import PyLZJB 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: ./PyLZJB.so: wrong ELF class: ELFCLASS32 

Помощь было бы здорово. :)

PS: Я бегу Ubuntu 10.4 64BIT


Edit:

Если кто-то может предложить мне альтернативный алгоритм сжатия я был бы одинаково счастливы. :)

Алгоритм для HTML сжатия, и она нуждается в стороне клиента поддержка Javascript декомпрессия/сжатия слишком.

Я действительно надеюсь, что кто-то может помочь в этом. Спасибо, парни!

+2

Ick, декомпрессии в JavaScript? Вы не можете использовать встроенную поддержку сжатия в большинстве современных браузеров и HTTP-серверов? –

+0

@ Николас - Я полностью согласен: декомпрессия в JavaScript, которая по сути является интерпретированным языком, будет очень медленной по сравнению с сжатием (или GZip) браузера (или операционной системы). @RadiantHex - Просто любопытно: зачем вам это нужно? –

+0

@ Николас: они ли GZIP параметры GET в запросе? – RadiantHex

ответ

4

Если кто-то может предложить мне альтернативный алгоритм сжатия, я был бы в равной степени счастлив.

Всегда есть хороший старый дефлят, гораздо более распространенный член семейства компрессии LZ. JavaScript implementation. How to handle raw deflate content with Python's zlib module.

Это много накладных расходов в относительно медленном клиентском коде, который будет сжимать данные отправки, и нет тривиального представления необработанных байтов, которые вы получите от него.

ли они Gzip Параметры GET в запросе?

Поля формы GET в строке запроса по своей природе должны быть довольно короткими, или вы превысите границы URL-адресов браузера или сервера.Нет смысла сжимать что-либо столь маленькое. Если у вас много данных, оно должно быть в форме POST.

Даже в форме POST по умолчанию enctype является application/x-www-form-urlencoded, что означает, что большая часть байтов будет кодироваться как %nn последовательностей. Это закроет ваше представление формы, возможно, за пределами первоначального несжатого размера. Чтобы отправить необработанные байты, вам нужно будет использовать форму enctype="multipart/form-data".

Даже тогда у вас будут проблемы с кодировкой. Строки JS являются Unicode, а не байтами, и будут закодированы с использованием кодировки страницы, содержащей форму. Это обычно должно быть UTF-8, но тогда вы не можете фактически генерировать произвольную последовательность байтов для загрузки путем кодирования на него, поскольку многие байтовые последовательности недействительны в UTF-8. Вы можете иметь байты в кодировке unicode, кодируя каждый байт в качестве блока кода для UTF-8, но это наполнит ваши сжатые байты на 50% (поскольку половина блоков кода, превышающих 0x80, будет кодировать два байта UTF-8).

В теории, если вы не возражаете против надлежащей поддержки интернационализации, вы можете использовать страницу как ISO-8859-1 и использовать idiom escape/encodeURIComponent для преобразования между UTF-8 и ISO-8859-1 для вывода. Но это не сработает, потому что браузеры лежат и на самом деле используют код Windows 1252 для кодирования/декодирования контента, отмеченный как ISO-8859-1. Вы могли бы использовать другую кодировку, которая сопоставила каждый байт символу, но это было бы более ручной накладной для кодирования и дополнительно ограничивало бы символы, которые вы могли бы использовать на странице.

Вы можете избежать проблем с кодированием, используя что-то вроде base64, но опять же, у вас больше накладных расходов на ручное кодирование и 33% раздувания.

Таким образом, все подходы плохие; Я не думаю, что вы получите много полезного из этого.

0

Вы можете либо запустить 32-разрядный Python, либо скомпилировать собственный PyLZJB, а не использовать предварительно построенный двоичный файл. Или получить 64-битный двоичный файл PyLZJB откуда-то.

7

Вы используете 64-битный интерпретатор Python и пытаетесь загрузить 32-разрядное расширение, и это недопустимо.

Вам необходимо иметь как ваш интерпретатор Python, так и расширение, скомпилированное для тех же архитектур. Хотя вы могли бы получить 32-битный интерпретатор Python, вероятно, было бы лучше получить 64-битное расширение.

Что вам нужно сделать, это получить исходный код для LZJB и построить его самостоятельно, чтобы получить 64-разрядный общий объект.

+1

@ Самуэль: спасибо за ответ! Я немного смущен тем, как его построить, не могли бы вы дать мне несколько указателей, пожалуйста? :) – RadiantHex

+1

@RadiantHex, если пакет использует 'distutils', он обычно прост, как запуск setup.py с вашим 64-битным временем выполнения python. Иногда вам нужно прибегнуть к указанию 'CFLAGS = - march = x86_64' и' CXXFLAGS = - march = x86_64' в вашей среде, в зависимости от того, как создается собственный код. Это предполагает архитектуру AMD x64, вам может понадобиться другой флаг, если вы на Intel. –

Смежные вопросы