考虑下面的代码: import ctypes IPC_PRIVATE, MAP_SIZE, IPC_CREAT, IPC_EXCL = 0, 65536, 512, 1024 shmget = ctypes.cdll.LoadLibrary("libc.so.6").shmget shmat = ctypes.cdll.LoadLibrary("libc.so.6").shmat shm_id = shmget(IPC_PRIVATE, MAP_SIZE, IPC_CREAT | IPC_EXCL | 0600) trace_bits = shmat(shm_id, 0, 0) s = ctypes.string_at(ctypes.c_void_p(trace_bits), 1) print(s[0]) 当我尝试运行它时,在成功运行shmat之后,它给了我一个“分段错误”。 我究竟做错了什么?
我有一个使用openmp的c99函数,它按预期工作。 我也写了一个使用ctypes的python接口,导致了这个问题。 Ctypes / python找不到openmp的库。 这是错误消息: File "foo.py", line 2, in <module> foobar=cdll.LoadLibrary("./libfoo.so") File "/usr/lib/python2.6/ctypes/__init__.py", line 431, in LoadLibrary return self._dlltype(name) File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__ self._handle = _dlopen(self._name, mode) OSError: ./libfoo.so: undefined symbol: GOMP_parallel_end 我使用这些cmds: gcc -fPIC -std=c99 -lm -Wall -fopenmp -pedantic -c foo.c gcc -shared -o libfoo.so foo.o python foo.py 我已经在Google上search并find了一个“解决scheme”,但我不明白这是什么意思: 我想我应该在构造函数上设置restype到ctypes.c_void_p。 […]
当我试图导入ctypes.wintypes得到这个错误,我该如何解决这个问题? In [2]: import ctypes.wintypes ————————————————————————— ValueError Traceback (most recent call last) <ipython-input-2-8395760a4e8a> in <module>() —-> 1 import ctypes.wintypes /usr/lib/python2.7/ctypes/wintypes.py in <module>() 21 22 from ctypes import _SimpleCData —> 23 class VARIANT_BOOL(_SimpleCData): 24 _type_ = "v" 25 def __repr__(self): ValueError: _type_ 'v' not supported
在Python中,可以使用ctypes.util.find_library以类似于编译器的方式来定位库。 在Mac OSX中,该函数返回完整的path名。 但在Linux中,只有文件名被返回。 (这里是文档 ) 有没有办法在linux中获得完整path?
我试图使用一个名为pvcam(光度计虚拟相机访问方法)与ctypes库。 这个专有的库是作为一个编译的共享对象(.so文件)分发的软件用户手册,并适用于C开发。 我想用ctypes包装这个库,所以我可以使用python而不是C。我试过了 ctypes.CDLL('libpvcam.so.2.7.4.2',mode=ctypes.RTLD_GLOBAL) 但是,然后python抱怨依赖。 OSError: /usr/lib/libpvcam.so.2.7.4.2: undefined symbol: raw1394_new_handle (我有安装libraw1394)根据这个库可能必须正确重新编译正确的标志。 作为专有的预编译对象,这是不可能的。 我怎样才能将这个.so加载到python中的ctypes?
有没有办法build立和使用Tesseract库和相应的Leptonica库(因为Tesseract依赖于Leptonica),因为它可以在Windows中完成? 我按照他们的说明编译了这些库,但似乎libtesseract.so.3.0.2包含一个到Leptonica共享库的固定path: $ ldd libtesseract.so.3.0.2 linux-vdso.so.1 => (0x00007fffbc5ff000) **liblept.so.4 => /usr/local/lib/liblept.so.4 (0x00007fa8400fd000)** libpng12.so.0 => /usr/lib64/libpng12.so.0 (0x00007fa83fcae000) libjpeg.so.62 => /usr/lib64/libjpeg.so.62 (0x00007fa83fa5e000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa83f5e4000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fa83f2de000) libm.so.6 => /lib64/libm.so.6 (0x00007fa83f059000) libc.so.6 => /lib64/libc.so.6 (0x00007fa83ecc5000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fa83eaaf000) /lib64/ld-linux-x86-64.so.2 (0x0000003080200000) 在未安装Leptonica的工作站上运行应用程序时,会导致OSError: OSError: liblept.so.4: cannot open shared object file: No such file or directory […]
我正在使用ctypes模块在Linux上执行一些ptrace系统调用,实际上它工作得很好。 但是,如果我得到一个错误,我想提供一些有用的信息。 因此,我做了一个get_errno()函数调用,它返回errno的值,但我没有find任何解释errno值的函数或其他东西,并给我一个相关的错误消息。 我错过了什么吗? 有没有基于ctypes的解决scheme? 这是我的设置: import logging from ctypes import get_errno, cdll from ctypes.util import find_library, errno # load the c lib libc = cdll.LoadLibrary(find_library("c"), use_errno=True) … 例: return_code = libc.ptrace(PTRACE_ATTACH, pid, None, None) if return_code == -1: errno = get_errno() error_msg = # here i wanna provide some information about the error logger.error(error_msg)
现在我正在研究一种还没有FFI的脚本语言。 我想知道什么是最简单的方法来实现它,假设我想写它像酷极客 – 我想写在脚本语言本身的FFI。 我需要接口的编程语言是C.所以基本知道libdl.so是我最好的朋友。 显然,这不是我唯一需要的东西,而是最重要的东西。 我只有轻微的想法,我还需要什么。 我想从FFI得到类似于python ctypes的行为。 为了达到这个目的,我需要知道什么? 我知道,我需要处理一些严重的数据结构。 我如何pipe理它,以便我可以在脚本语言本身中完成大部分严重的魔术? 除了外部函数接口之外,我还会使用这种魔法。 例如,我可能想要传递类似C的二进制数据到文件。
比方说,我有一个python脚本通过ctypes加载共享库(SL)。 SLbuild立一个pthread T1 python脚本通过SL来configurationcallback函数,即python脚本通过引用python可调用函数调用SL函数 替代文字http://img.zgserver.com/python/L.jpg 现在让我们假设T1调用一个“callback”函数,下面的假设是正确的: Python端的callback函数在T1的上下文中执行 我可以使用队列在T1和Python VM之间进行通信 我将需要在Python VM端轮询所述queue 我理解线程的所有概念,共享状态等,但是我还没有深入地讨论Python的multithreading方面。 由于目前我还不知道适应层(ctypes),恐怕我会错过这个过程的一些关键方面。
所以我得到了一个32位Linux机器上的ctypes segfault,我不能在64位达尔文或Linux上重现。 这里是C: typedef struct { void *ptr; } doodle; doodle C_intpointerfunction(int *a) { *a = 41; doodle foo; foo.ptr = a; return foo; } 这是编译与: gcc -c intpointerlibrary.c gcc -shared intpointerlibrary.o -o libintpointerlib.so 这里是Python: import numpy as N from ctypes import * _libintpointer = N.ctypeslib.load_library('libintpointerlib.so','.') _libintpointer.C_intpointerfunction.restype = c_void_p _libintpointer.C_intpointerfunction.argtypes = [POINTER(c_int)] def P_intpointerfunction(): lrc […]