【问题标题】:Wrong ELF class - Python错误的 ELF 类 - Python
【发布时间】:2010-07-27 22:30:34
【问题描述】:

我正在尝试安装此库以进行 LZJB 压缩。 PyLZJB LINK

该库是一个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


编辑:

如果有人可以向我推荐一种替代压缩算法,我会同样高兴。 :)

该算法用于HTML压缩,需要客户端Javascript解压/压缩支持

我真的希望有人可以帮助解决这个问题。谢谢大家!

【问题讨论】:

  • Ick,在 JavaScript 中解压?您不能利用大多数现代浏览器和 HTTP 服务器中的内置压缩支持吗?
  • @Nicholas – 我完全同意:本质上是一种解释性语言的 JavaScript 中的解压缩与浏览器(或操作系统)的本机 (GZip) 压缩相比会非常慢。 @RadiantHex – 只是好奇:你为什么需要这个?
  • @Nicholas:他们会在请求中压缩 GET 参数吗?
  • @Marcel:我正在向服务器发送大量调试数据……我真的需要压缩它。此外,对于 GET 请求,压缩也是一种序列化数据的简单方法,你不觉得吗? :)
  • @RadiantHex:如果您在 GET 参数中放入了足够多的数据来证明压缩的合理性,那么您的应用程序设计几乎肯定有问题。我强烈建议发布一个新问题,询问有关如何以更理智的方式完成您正在做的事情的建议。

标签: javascript python compression libraries lzw


【解决方案1】:

您正在运行 64 位 Python 解释器并尝试加载 32 位扩展,这是不允许的。

您需要为相同的架构编译 Python 解释器和扩展。虽然您可以获得 32 位 Python 解释器,但获得 64 位扩展可能会更好。

您应该做的是获取LZJB 的源并自己构建它以获得64 位共享对象。

【讨论】:

  • @Samuel:感谢您的回复!我对如何构建它有点困惑,请您给我一些指示吗? :)
  • @RadiantHex,如果包使用distutils,通常就像使用 64 位 python 运行时运行 setup.py 一样简单。有时,您需要在您的环境中指定CFLAGS=--march=x86_64CXXFLAGS=--march=x86_64,具体取决于本机代码的构建方式。这假定 AMD x64 架构,如果您使用的是 Intel,则可能需要不同的标志。
【解决方案2】:

如果有人可以向我推荐一种替代压缩算法,我会同样高兴。

总是有很好的旧放气,这是 LZ 压缩系列中更常见的成员。 JavaScript implementationHow to handle raw deflate content with Python's zlib module.

在相对较慢的客户端代码中压缩提交数据会产生大量开销,并且提交您将从中获得的原始字节并非易事。

他们是否在请求中压缩 GET 参数?

查询字符串中的 GET 表单提交本质上必须相当短,否则您将超出浏览器或服务器 URL 长度限制。压缩这么小的东西是没有意义的。如果您有大量数据,则需要以 POST 形式发送。

即使在 POST 形式中,默认的 enctypeapplication/x-www-form-urlencoded,这意味着大部分字节将被编码为 %nn 序列。这将使您的表单提交膨胀,可能超出原始未压缩的大小。要提交原始字节,您必须使用enctype="multipart/form-data" 表单。

即便如此,您也会遇到编码问题。 JS 字符串是 Unicode 而不是字节,将使用包含表单的页面的编码进行编码。这通常应该是 UTF-8,但是您实际上不能通过对其进行编码来生成用于上传的任意字节序列,因为许多字节序列在 UTF-8 中无效。您可以通过将每个字节作为代码单元编码为 UTF-8 来获得 Unicode 中的字节,但这会使您的压缩字节膨胀 50%(因为超过 0x80 的代码单元的一半将编码为两个 UTF- 8 个字节)。

理论上,如果您不介意失去适当的国际化支持,您可以将页面作为 ISO-8859-1 提供,并使用 escape/encodeURIComponent 成语在 UTF-8 和 ISO-8859-1 之间转换以进行输出。但这行不通,因为浏览器撒谎并且实际上使用 Windows 代码页 1252 来编码/解码标记为 ISO-8859-1 的内容。您可以使用另一种将每个字节映射到一个字符的编码,但这会产生更多的手动编码开销,并且会进一步限制您可以在页面中使用的字符。

您可以通过使用 base64 之类的东西来避免编码问题,但同样,您会产生更多的手动编码性能开销和 33% 的膨胀。

总而言之,所有方法都不好;我不认为你会从中得到什么有用的东西。

【讨论】:

    【解决方案3】:

    您可以运行 32 位 Python 或编译自己的 PyLZJB,而不是使用预构建的二进制文件。或者从某个地方获取一个 64 位二进制 PyLZJB。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-04
      • 2016-11-25
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 2013-09-05
      • 2012-08-19
      相关资源
      最近更新 更多