-------- Original-Nachricht --------
> Datum: Fri, 10 Sep 2010 11:06:42 -0600
> Von: Sean Gillies <[email protected]>
> An: "gispython.org community projects" <[email protected]>
> Betreff: Re: [Community] Loading libgeos_c fails with installation in home 
> directory of libgeos_c and python

> On Fri, Sep 10, 2010 at 4:13 AM,  <[email protected]> wrote:
> >> On Thu, Sep 9, 2010 at 12:52 AM, oekopez <[email protected]> wrote:
> >> >>On Wed, Sep 8, 2010 at 2:32 AM,  <[email protected]> wrote:
> >> >>> Dear Shapely-Developers,
> >> >>>
> >> >>> First: thank you for Shapely!
> >> >>> I have to install Shapely on a cluster (scientific linux), where i
> >> don't
> >> > have root privilegs. Python, as well as libgeos_c are installed (from
> >> > source) under $HOME/local/lib and $HOME/local/bin. The first is in
> >> > $LD_LIBRARY_PATH and the latter in $PATH. Unfortunatly
> >> ctypes.find_library
> >> > seems to fail under these circumstances. Can you fix geos.py to fall
> >> back to
> >> > the any *nix variant, for loading libgeos_c, if find_library does not
> >> find
> >> > the library?
> >> >>>
> >> >>> A possible solution (working for me) could be changing line 28-32
> in
> >> > geos.py to (inspired by your code line 83-92):
> >> >>>
> >> >>> if sys.platform == 'linux2':
> >> >>>    lib = find_library('geos_c')
> >> >>>    if lib is None:
> >> >>>        try:
> >> >>>            _lgeos = CDLL('libgeos_c.so.1')
> >> >>>        except (OSError, ImportError):
> >> >>>            _lgeos = CDLL('libgeos_c.so')
> >> >>>        except:
> >> >>>            raise
> >> >>>    else:
> >> >>>        _lgeos = CDLL(lib)
> >> >>>    free = CDLL(find_library('c')).free
> >> >>>    free.argtypes = [c_void_p]
> >> >>>    free.restype = None
> >> >>>
> >> >>>
> >> >>> Thank you,
> >> >>>
> >> >>> Philipp
> >> >>
> >> >>Hi Philipp,
> >> >>
> >> >>You are very welcome! I'm glad you like it.
> >> >>
> >> >>I won't rule out the change you suggested, but first I'd like to make
> >> >>sure that we can't solve this by sorting your library path. I am
> >> >>routinely testing and deploying Shapely using zc.buildout and
> >> >>modifying LD_LIBRARY_PATH so that Shapely (in a virtualenv) can find
> a
> >> >>specific, local libgeos_c.so (also built from source). Without any
> >> >>root privileges or system-wide installs. Can you check that
> >> >>$HOME/local/lib and $HOME/local/bin are at the head of
> LD_LIBRARY_PATH
> >> >>and PATH?
> >> >>
> >> >>Cheers,
> >> >>
> >> >>--
> >> >>Sean
> >> >>
> >> >>
> >> > Dear Sean,
> >> > thank you for your prompt answer.
> >> > I checked the paths, but since I'm not a Linux-pro I attach some
> output
> >> > (variables, errormsg's, tests). However, it may always happen, for
> >> different
> >> > resaons, that find_library fails (e.g. geos missing). Some kind of
> error
> >> > handling with a clear error message (like "libgeos_c not found")
> might
> >> be
> >> > nice anyway.
> >> > The system I am using is a commercial cluster system with scientific
> >> linux
> >> > 5.5.
> >> >
> >> > So here's my environment:
> >> >
> >> > [gh1...@skylla1 ~]$ echo $PATH
> >> >
> >>
> /home/gh1961/local/lib:/home/gh1961/local/bin:/cm/shared/apps/gcc/4.3.4/bin:
> >> >
> >>
> /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/cm/shared/ap
> >> >
> >>
> ps/mvapich2/gcc/64/1.2/bin:/cm/shared/apps/mvapich2/gcc/64/1.2/sbin:/home/gh
> >> > 1961/bin
> >> > [gh1...@skylla1 ~]$ echo $LD_LIBRARY_PATH
> >> >
> >>
> /home/gh1961/local/bin:/cm/shared/apps/gcc/4.3.4/lib:/cm/shared/apps/gcc/4.3
> >> > .4/lib64:/cm/shared/apps/mvapich2/gcc/64/1.2/lib
> >> > [gh1...@skylla1 ~]$
> >> >
> >>
> >> Thanks for printing out those env vars. You need
> >> /home/gh1961/local/lib at the start of LD_LIBRARY_PATH and
> >> /home/gh1961/local/bin at the start of PATH. You have them reversed.
> >>
> >> Good idea about raising something other than AttributeError.
> >>
> >> Cheers,
> >>
> >> --
> >> Sean
> >
> > Dear Sean,
> >
> > thanks again, but it is still not working (ctypes.find_library). This is
> my new environment:
> > [gh1...@skylla1 ~]$ echo $PATH
> >
> /home/gh1961/local/bin:/home/gh1961/local/lib:/cm/shared/apps/gcc/4.3.4/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/cm/shared/apps/mvapich2/gcc/64/1.2/bin:/cm/shared/apps/mvapich2/gcc/64/1.2/sbin:/cm/shared/apps/sge/6.2u5/bin/lx26-amd64:/home/gh1961/bin
> > [gh1...@skylla1 ~]$ echo $LD_LIBRARY_PATH
> >
> /home/gh1961/local/lib:/home/gh1961/local/bin:/cm/shared/apps/gcc/4.3.4/lib:/cm/shared/apps/gcc/4.3.4/lib64:/cm/shared/apps/mvapich2/gcc/64/1.2/lib:/cm/shared/apps/sge/6.2u5/lib/lx26-amd64
> >
> > The same errors prevail.
> > I don't see a reason why not implementing a fallback in case of
> find_library fails, as you have for any other OS. Therefore I've got a
> findgeos-module attached which is working on the cluster and on my workstation
> (windows). Unfortunatly I do not have other systems to test it. But basically 
> it is
> still your code, just refactored and with the fallback for a failed
> find_library.
> > To use the module lines 28-101 in geos.py simplify to:
> >
> > from .findgeos import findlibrary
> > _lgeos,free, geos_c_version = findlibrary(warn=False)
> >
> > Since I am using Shapely in a hydrological modeling toolkit, fixing this
> problem is crucial for the deployment of my software.
> >
> > BTW: I appreciate Shapely for being IO free, but I am happy to share an
> extremely lightweight (or primitive) pure Python ESRI Shapefile reader,
> based on Shapely and struct, in case anyone needs one.
> >
> > Cheers,
> >
> > Philipp
> >
> >
> > findgeos.py
> > """
> > finds the geos_c library for different platforms
> > """
> >
> > import os
> > import sys
> > import ctypes
> > from ctypes import cdll, CDLL, PyDLL, CFUNCTYPE, c_char_p, c_void_p
> > from ctypes.util import find_library
> >
> > def linux(warn):
> >    geos_name = find_library('geos_c')
> >    c_name=find_library('c')
> >    if not c_name:
> >        raise ImportError("""Shapely: The C runtime of your system
> has not been
> >                found. This is a problem with your system
> setup""")
> >    free = CDLL(c_name).free
> >    free.argtypes = [c_void_p]
> >    free.restype = None
> >
> >    if geos_name:
> >        return CDLL(geos_name),free
> >    else:
> >        if warn:
> >            warnmsg="Shapely: libgeos_c not found with standard
> way. "
> >            warnmsg+="Trying alternative method."
> >            print warnmsg
> >        try:
> >            _lgeos = CDLL('libgeos_c.so.1')
> >        except (OSError, ImportError):
> >            try:
> >                _lgeos = CDLL('libgeos_c.so')
> >            except(OSError, ImportError):
> >                errmsg= "'geos_c' not found. Please check your
> geos installation"
> >                errmsg+="and $PATH and $LD_LIBRARY_PATH"
> >                raise ImportError(errmsg)
> >        except:
> >            raise
> >        return _lgeos,free
> >
> > def darwin():
> >    lib = find_library('geos_c')
> >    if lib is None:
> >        ## try a few more locations
> >        lib_paths = [
> >            # The Framework build from Kyng Chaos:
> >          
>  "/Library/Frameworks/GEOS.framework/Versions/Current/GEOS",
> >            # macports
> >            '/opt/local/lib/libgeos_c.dylib',
> >        ]
> >        for path in lib_paths:
> >            if os.path.exists(path):
> >                lib = path
> >                break
> >    if lib is None:
> >        raise ImportError("Could not find geos_c library")
> >    _lgeos = CDLL(lib)
> >    c_name=find_library('c')
> >    if not c_name:
> >        raise ImportError("""Shapely: The C runtime of your system
> has not been
> >                found. This is a problem with your system
> setup""")
> >    free = CDLL(c_name).free
> >    free.argtypes = [c_void_p]
> >    free.restype = None
> >    return _lgeos,free
> >
> > def sunos5():
> >    # Try the major versioned name first, falling back on the
> unversioned name.
> >    try:
> >        _lgeos = CDLL('libgeos_c.so.1')
> >    except (OSError, ImportError):
> >        _lgeos = CDLL('libgeos_c.so')
> >    except:
> >        raise
> >    try:
> >        free = CDLL('libc.so.1').free
> >    except (OSError,ImportError):
> >        raise ImportError("""Shapely: The C runtime of your system
> has not been
> >                found. This is a problem with your system
> setup""")
> >    free.argtypes = [c_void_p]
> >    free.restype = None
> >    return _lgeos,free
> >
> > def win32():
> >    try:
> >        local_dlls = os.path.abspath(os.__file__ + "../../../DLLs")
> >        original_path = os.environ['PATH']
> >        os.environ['PATH'] = "%s;%s" % (local_dlls, original_path)
> >        _lgeos = CDLL("geos.dll")
> >    except (ImportError, WindowsError):
> >        raise
> >    def free(m):
> >        try:
> >            cdll.msvcrt.free(m)
> >        except WindowsError:
> >            # XXX: See
> http://trac.gispython.org/projects/PCL/ticket/149
> >            pass
> >    return _lgeos,free
> >
> >
> > def findlibrary(warn=False):
> >    """The function is searching platform dependent for the geos_c
> library
> >    and the free function from system dependent C runtime.
> >    Returns: ctypes.CDLL(geos_c), free, a tuple containing the version
> of geos_c
> >    Parameters: warn, if True warns for linux systems, if the library
> is not
> >                found using ctypes.find_library('geos_c')
> >    """
> >
> >    # Find and load the GEOS and C libraries
> >    if sys.platform == 'linux2':
> >        _lgeos,free = linux(warn)
> >    elif sys.platform == 'darwin':
> >        _lgeos,free = darwin()
> >
> >    elif sys.platform == 'win32':
> >        _lgeos,free = win32()
> >
> >    elif sys.platform == 'sunos5':
> >        _lgeos,free = linux(warn)
> >
> >    # Check if the version of GEOS is ok
> >    def _geos_c_version():
> >        func = _lgeos.GEOSversion
> >        func.restype = c_char_p
> >        v = func().split('-')[2]
> >        return tuple(int(n) for n in v.split('.'))
> >
> >    geos_c_version = _geos_c_version()
> >    return _lgeos,free,geos_c_version
> >
> 
> I'm not familiar with the scientific linux distro, but if find_library
> doesn't work, it doesn't work. I pushed some changes that attempt to
> do the same thing as your code:
> 
> http://github.com/sgillies/shapely/commit/b89fd614653a1d636a51cb2d27d75039769a27d5
> 
> Would you be willing to give that a try?
> 
> -- 
> Sean Gillies
> _______________________________________________
> Community mailing list
> [email protected]
> http://lists.gispython.org/mailman/listinfo/community


Dear Sean,

it works great and is more flexible. Thanks alot for your affort. Do you have 
any plans when this becomes part of the official release? 

BTW: Scientific linux immitates RHEL.

Philipp
-- 
GRATIS: Spider-Man 1-3 sowie 300 weitere Videos!
Jetzt freischalten! http://portal.gmx.net/de/go/maxdome
_______________________________________________
Community mailing list
[email protected]
http://lists.gispython.org/mailman/listinfo/community

Reply via email to