12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- """Python bindings for 0MQ."""
- # Copyright (C) PyZMQ Developers
- # Distributed under the terms of the Modified BSD License.
- # load bundled libzmq, if there is one:
- def _load_libzmq():
- """load bundled libzmq if there is one"""
- import sys, platform, os
- dlopen = hasattr(sys, 'getdlopenflags') # unix-only
- # RTLD flags are added to os in Python 3
- # get values from os because ctypes values are WRONG on pypy
- PYPY = platform.python_implementation().lower() == 'pypy'
-
- if dlopen:
- import ctypes
- dlflags = sys.getdlopenflags()
- # set RTLD_GLOBAL, unset RTLD_LOCAL
- flags = ctypes.RTLD_GLOBAL | dlflags
- # ctypes.RTLD_LOCAL is 0 on pypy, which is *wrong*
- flags &= ~ getattr(os, 'RTLD_LOCAL', 4)
- # pypy on darwin needs RTLD_LAZY for some reason
- if PYPY and sys.platform == 'darwin':
- flags |= getattr(os, 'RTLD_LAZY', 1)
- flags &= ~ getattr(os, 'RTLD_NOW', 2)
- sys.setdlopenflags(flags)
- try:
- from . import libzmq
- except ImportError:
- pass
- else:
- # store libzmq as zmq._libzmq for backward-compat
- globals()['_libzmq'] = libzmq
- if PYPY:
- # should already have been imported above, so reimporting is as cheap as checking
- import ctypes
- # some versions of pypy (5.3 < ? < 5.8) needs explicit CDLL load for some reason,
- # otherwise symbols won't be globally available
- # do this unconditionally because it should be harmless (?)
- ctypes.CDLL(libzmq.__file__, ctypes.RTLD_GLOBAL)
- finally:
- if dlopen:
- sys.setdlopenflags(dlflags)
- _load_libzmq()
- # zmq top-level imports
- from zmq import backend
- from zmq.backend import *
- from zmq import sugar
- from zmq.sugar import *
- def get_includes():
- """Return a list of directories to include for linking against pyzmq with cython."""
- from os.path import join, dirname, abspath, pardir, exists
- base = dirname(__file__)
- parent = abspath(join(base, pardir))
- includes = [ parent ] + [ join(parent, base, subdir) for subdir in ('utils',) ]
- if exists(join(parent, base, 'include')):
- includes.append(join(parent, base, 'include'))
- return includes
- def get_library_dirs():
- """Return a list of directories used to link against pyzmq's bundled libzmq."""
- from os.path import join, dirname, abspath, pardir
- base = dirname(__file__)
- parent = abspath(join(base, pardir))
- return [ join(parent, base) ]
- COPY_THRESHOLD = 65536
- __all__ = ['get_includes', 'COPY_THRESHOLD'] + sugar.__all__ + backend.__all__
|