43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
|
"""Import workaround so that Bazel, Py2/Py3, and enum34 package work together.
|
||
|
|
||
|
This works around a problem due to the combination of Bazel putting
|
||
|
third party packages before the stdlib in PYTHONPATH. What happens is:
|
||
|
* The enum34 PyPi package is imported as 'enum'.
|
||
|
* Bazel puts the path to enum34 before the stdlib, hence 'import enum'
|
||
|
will prefer to use enum34 from above instead of the stdlib.
|
||
|
* In Python 3, enum34 is used instead of the stdlib, which breaks
|
||
|
lots of things. It works fine in Python 2, since there is no enum
|
||
|
module.
|
||
|
|
||
|
To work around this, we do 3 things:
|
||
|
1. Put the enum34 code on PYTHONPATH, but not directly importable as
|
||
|
'enum'; it is under the (non importable) directory name with the
|
||
|
PyPi package name and version.
|
||
|
2. Try to import enum normally, if it works, great. This makes Py3 work
|
||
|
(as well as Py2 when enum is available as normal).
|
||
|
3. If the normal enum import failed, then try to find the enum34
|
||
|
entry on sys.path, and append the missing directory name.
|
||
|
|
||
|
Once it is successfully imported, expose the module directly. This
|
||
|
prevents importing the module twice under different names. e.g.,
|
||
|
the following is true:
|
||
|
from absl._enum_module import enum as absl_enum
|
||
|
import enum as normal_enum
|
||
|
assert absl_enum is normal_enum
|
||
|
"""
|
||
|
# pylint: disable=unused-import
|
||
|
import sys
|
||
|
import six
|
||
|
|
||
|
try:
|
||
|
import enum
|
||
|
except ImportError:
|
||
|
if six.PY3:
|
||
|
# While not all Py3's have enum, only the ones we support do.
|
||
|
raise
|
||
|
for i, path in enumerate(sys.path):
|
||
|
if '/enum34_archive' in path:
|
||
|
sys.path[i] = path + '/enum34-1.1.6'
|
||
|
|
||
|
import enum
|