> 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
--
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