On 9/2/17, eryk sun <eryk...@gmail.com> wrote: > On Fri, Sep 1, 2017 at 3:23 AM, Peter Otten <__pete...@web.de> wrote: >> >> I think you have to specify the types yourself: >> >>>>> import ctypes >>>>> libm = ctypes.cdll.LoadLibrary("libm.so") >>>>> libm.sqrt(42) >> 0 >>>>> libm.sqrt.argtypes = [ctypes.c_double] >>>>> libm.sqrt.restype = ctypes.c_double >>>>> libm.sqrt(42) >> 6.48074069840786 > > On POSIX systems, use ctypes.util.find_library('m'), which, for > example, resolves to "libm.so.6" in Ubuntu Linux 16.04. On the same > system, "libm.so" is an ld script that's used by the compile-time > linker. > > $ cat /usr/lib/x86_64-linux-gnu/libm.so > /* GNU ld script > */ > OUTPUT_FORMAT(elf64-x86-64) > GROUP ( /lib/x86_64-linux-gnu/libm.so.6 > AS_NEEDED ( > /usr/lib/x86_64-linux-gnu/libmvec_nonshared.a > /lib/x86_64-linux-gnu/libmvec.so.1 ) ) > > The runtime linker doesn't know how to handle this script. > > >>> ctypes.CDLL('libm.so') > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File "/usr/lib/python3.5/ctypes/__init__.py", > line 347, in __init__ > self._handle = _dlopen(self._name, mode) > OSError: /usr/lib/x86_64-linux-gnu/libm.so: invalid ELF header
Peter and Eryk thanks very much! :) BTW julia on ubuntu 16.04 could do it -> julia> result = ccall((:sqrt, "libm"), Cdouble, (Cdouble,), 1.3) 1.140175425099138 but I am afraid that it probably uses some llvm's magic so it could not help to solve this problem in ctypes... -- https://mail.python.org/mailman/listinfo/python-list