__init__.py
62 lines
| 2.3 KiB
| text/x-python
|
PythonLexer
Gregory Szorc
|
r37513 | # Copyright (c) 2017-present, Gregory Szorc | ||
# All rights reserved. | ||||
# | ||||
# This software may be modified and distributed under the terms | ||||
# of the BSD license. See the LICENSE file for details. | ||||
"""Python interface to the Zstandard (zstd) compression library.""" | ||||
from __future__ import absolute_import, unicode_literals | ||||
# This module serves 2 roles: | ||||
# | ||||
# 1) Export the C or CFFI "backend" through a central module. | ||||
# 2) Implement additional functionality built on top of C or CFFI backend. | ||||
import os | ||||
import platform | ||||
# Some Python implementations don't support C extensions. That's why we have | ||||
# a CFFI implementation in the first place. The code here import one of our | ||||
# "backends" then re-exports the symbols from this module. For convenience, | ||||
# we support falling back to the CFFI backend if the C extension can't be | ||||
# imported. But for performance reasons, we only do this on unknown Python | ||||
# implementation. Notably, for CPython we require the C extension by default. | ||||
# Because someone will inevitably want special behavior, the behavior is | ||||
# configurable via an environment variable. A potentially better way to handle | ||||
# this is to import a special ``__importpolicy__`` module or something | ||||
# defining a variable and `setup.py` could write the file with whatever | ||||
# policy was specified at build time. Until someone needs it, we go with | ||||
# the hacky but simple environment variable approach. | ||||
_module_policy = os.environ.get('PYTHON_ZSTANDARD_IMPORT_POLICY', 'default') | ||||
if _module_policy == 'default': | ||||
if platform.python_implementation() in ('CPython',): | ||||
from zstd import * | ||||
backend = 'cext' | ||||
elif platform.python_implementation() in ('PyPy',): | ||||
from zstd_cffi import * | ||||
backend = 'cffi' | ||||
else: | ||||
try: | ||||
from zstd import * | ||||
backend = 'cext' | ||||
except ImportError: | ||||
from zstd_cffi import * | ||||
backend = 'cffi' | ||||
elif _module_policy == 'cffi_fallback': | ||||
try: | ||||
from zstd import * | ||||
backend = 'cext' | ||||
except ImportError: | ||||
from zstd_cffi import * | ||||
backend = 'cffi' | ||||
elif _module_policy == 'cext': | ||||
from zstd import * | ||||
backend = 'cext' | ||||
elif _module_policy == 'cffi': | ||||
from zstd_cffi import * | ||||
backend = 'cffi' | ||||
else: | ||||
raise ImportError('unknown module import policy: %s; use default, cffi_fallback, ' | ||||
'cext, or cffi' % _module_policy) | ||||