在32位库中使用python ctypes

2024-09-21 03:20:09 发布

您现在位置:Python中文网/ 问答频道 /正文

当我尝试导入一个加载32位库的简单ctype模块时,我得到:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "simple_test.py", line 5, in <module>
    _myLib = ctypes.CDLL(_path + _file)
  File "/usr/lib/python2.7/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ../../bin/mylib.so: wrong ELF class: ELFCLASS32

Python3.3也会出现这种情况。在

这里的问题是我不想把我的库重新编译为64位, 我有办法让它工作吗?在

谢谢, 克伦


Tags: 模块inpyselfmostinitlinecall
2条回答

还有(相对而言)新的MSL-LoadLib可以使用。在

这基本上是沙丘在他的例子中所描述的,但是它与Python32捆绑在一起,所以你不必处理这个问题。在

您根本无法将32位代码加载到64位应用程序中,反之亦然。您的选择是:

  1. 切换到使用32位解释器
  2. 继续使用64位解释器,但要使用multiprocessing以便允许64位解释器与32位解释器通信。在
  3. 将32位库重新编译为64位库

前两个选项有一个问题,即在基于debian的发行版上,不能使用包管理器同时安装32位解释器和64位解释器(参见eryksun的评论)。在

重新编译库几乎肯定是更容易的选择,而且绝对不会带来运行时开销。在

一个如何做数字(2)的例子。预先警告:如果您经常使用这些方法,或者使用大量的输入/输出,这将导致来回发送数据的高开销。在

在主.py在

# example using the standard c library
from subprocess import Popen, PIPE 
from multiprocessing.managers import BaseManager
import atexit

p = Popen(["/path/to/32-bit/python", "/path/to/delegate.py"], stdout=PIPE)

atexit.register(p.terminate)

port = int(p.stdout.readline())
authkey = p.stdout.read()

m = BaseManager(address=("localhost", port), authkey=authkey)
m.connect()

# tell manager to expect an attribute called LibC
m.register("LibC")

# access and use libc
libc = m.LibC()
print(libc.abs(-2))

代理.py在

^{pr2}$

相关问题 更多 >

    热门问题