diff --git a/shapely/geos.py b/shapely/geos.py index d5a67d2..19b7ffc 100644 --- a/shapely/geos.py +++ b/shapely/geos.py @@ -61,127 +61,10 @@ def load_dll(libname, fallbacks=None, mode=DEFAULT_MODE): "Could not find lib {} or load any of its variants {}.".format( libname, fallbacks or [])) -_lgeos = None - -if sys.platform.startswith('linux'): - # Test to see if we have a wheel repaired by 'auditwheel' containing its - # own libgeos_c - geos_whl_so = glob.glob(os.path.abspath(os.path.join(os.path.dirname( - __file__), '.libs/libgeos_c-*.so.*'))) - if len(geos_whl_so) == 1: - _lgeos = CDLL(geos_whl_so[0]) - LOG.debug("Found GEOS DLL: %r, using it.", _lgeos) - elif hasattr(sys, 'frozen'): - geos_pyinstaller_so = glob.glob(os.path.join(sys.prefix, 'libgeos_c-*.so.*')) - if len(geos_pyinstaller_so) == 1: - _lgeos = CDLL(geos_pyinstaller_so[0]) - LOG.debug("Found GEOS DLL: %r, using it.", _lgeos) - elif os.getenv('CONDA_PREFIX', ''): - # conda package. - _lgeos = CDLL(os.path.join(sys.prefix, 'lib', 'libgeos_c.so')) - else: - alt_paths = [ - 'libgeos_c.so.1', - 'libgeos_c.so', - ] - _lgeos = load_dll('geos_c', fallbacks=alt_paths) - # Necessary for environments with only libc.musl - c_alt_paths = [ - 'libc.musl-x86_64.so.1' - ] - free = load_dll('c', fallbacks=c_alt_paths).free - free.argtypes = [c_void_p] - free.restype = None - -elif sys.platform == 'darwin': - # Test to see if we have a delocated wheel with a GEOS dylib. - geos_whl_dylib = os.path.abspath(os.path.join(os.path.dirname( - __file__), '.dylibs/libgeos_c.1.dylib')) - - if os.path.exists(geos_whl_dylib): - handle = CDLL(None) - if hasattr(handle, "initGEOS_r"): - LOG.debug("GEOS already loaded") - _lgeos = handle - else: - _lgeos = CDLL(geos_whl_dylib) - LOG.debug("Found GEOS DLL: %r, using it.", _lgeos) - - elif os.getenv('CONDA_PREFIX', ''): - # conda package. - _lgeos = CDLL(os.path.join(sys.prefix, 'lib', 'libgeos_c.dylib')) - else: - if hasattr(sys, 'frozen'): - try: - # .app file from py2app - alt_paths = [os.path.join( - os.environ['RESOURCEPATH'], '..', 'Frameworks', - 'libgeos_c.dylib')] - except KeyError: - # binary from pyinstaller - alt_paths = [ - os.path.join(sys.executable, 'libgeos_c.dylib')] - if hasattr(sys, '_MEIPASS'): - alt_paths.append( - os.path.join(sys._MEIPASS, 'libgeos_c.1.dylib')) - else: - alt_paths = [ - # The Framework build from Kyng Chaos - "/Library/Frameworks/GEOS.framework/Versions/Current/GEOS", - # macports - '/opt/local/lib/libgeos_c.dylib', - # homebrew - '/usr/local/lib/libgeos_c.dylib', - ] - _lgeos = load_dll('geos_c', fallbacks=alt_paths) - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc Python is actually using. - free = CDLL(None).free - free.argtypes = [c_void_p] - free.restype = None - -elif sys.platform == 'win32': - if os.getenv('CONDA_PREFIX', ''): - # conda package. - _lgeos = CDLL(os.path.join(sys.prefix, 'Library', 'bin', 'geos_c.dll')) - else: - try: - egg_dlls = os.path.abspath( - os.path.join(os.path.dirname(__file__), 'DLLs')) - if hasattr(sys, '_MEIPASS'): - wininst_dlls = sys._MEIPASS - elif hasattr(sys, "frozen"): - wininst_dlls = os.path.normpath( - os.path.abspath(sys.executable + '../../DLLS')) - else: - wininst_dlls = os.path.abspath(os.__file__ + "../../../DLLs") - original_path = os.environ['PATH'] - os.environ['PATH'] = "%s;%s;%s" % \ - (egg_dlls, wininst_dlls, original_path) - _lgeos = load_dll("geos_c.dll") - except (ImportError, WindowsError, OSError): - raise - - def free(m): - try: - cdll.msvcrt.free(m) - except WindowsError: - # XXX: See http://trac.gispython.org/projects/PCL/ticket/149 - pass - -elif sys.platform == 'sunos5': - _lgeos = load_dll('geos_c', fallbacks=['libgeos_c.so.1', 'libgeos_c.so']) - free = CDLL('libc.so.1').free - free.argtypes = [c_void_p] - free.restype = None -else: # other *nix systems - _lgeos = load_dll('geos_c', fallbacks=['libgeos_c.so.1', 'libgeos_c.so']) - free = load_dll('c', fallbacks=['libc.so.6']).free - free.argtypes = [c_void_p] - free.restype = None +_lgeos = CDLL('@libgeos_c@') +free = CDLL('@libc@').free +free.argtypes = [c_void_p] +free.restype = None def _geos_version(): diff --git a/tests/test_dlls.py b/tests/test_dlls.py index 35f9cc2..3dfcaac 100644 --- a/tests/test_dlls.py +++ b/tests/test_dlls.py @@ -12,12 +12,7 @@ class LoadingTestCase(unittest.TestCase): @unittest.skipIf(sys.platform == "win32", "FIXME: adapt test for win32") def test_fallbacks(self): load_dll('geos_c', fallbacks=[ - os.path.join(sys.prefix, "lib", "libgeos_c.dylib"), # anaconda (Mac OS X) - '/opt/local/lib/libgeos_c.dylib', # MacPorts - '/usr/local/lib/libgeos_c.dylib', # homebrew (Mac OS X) - os.path.join(sys.prefix, "lib", "libgeos_c.so"), # anaconda (Linux) - 'libgeos_c.so.1', - 'libgeos_c.so']) + '@libgeos_c@']) def test_suite():