environment.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from __future__ import division, absolute_import, print_function
  2. import os
  3. import warnings
  4. from distutils.dist import Distribution
  5. __metaclass__ = type
  6. class EnvironmentConfig(object):
  7. def __init__(self, distutils_section='ALL', **kw):
  8. self._distutils_section = distutils_section
  9. self._conf_keys = kw
  10. self._conf = None
  11. self._hook_handler = None
  12. def dump_variable(self, name):
  13. conf_desc = self._conf_keys[name]
  14. hook, envvar, confvar, convert, append = conf_desc
  15. if not convert:
  16. convert = lambda x : x
  17. print('%s.%s:' % (self._distutils_section, name))
  18. v = self._hook_handler(name, hook)
  19. print(' hook : %s' % (convert(v),))
  20. if envvar:
  21. v = os.environ.get(envvar, None)
  22. print(' environ: %s' % (convert(v),))
  23. if confvar and self._conf:
  24. v = self._conf.get(confvar, (None, None))[1]
  25. print(' config : %s' % (convert(v),))
  26. def dump_variables(self):
  27. for name in self._conf_keys:
  28. self.dump_variable(name)
  29. def __getattr__(self, name):
  30. try:
  31. conf_desc = self._conf_keys[name]
  32. except KeyError:
  33. raise AttributeError(name)
  34. return self._get_var(name, conf_desc)
  35. def get(self, name, default=None):
  36. try:
  37. conf_desc = self._conf_keys[name]
  38. except KeyError:
  39. return default
  40. var = self._get_var(name, conf_desc)
  41. if var is None:
  42. var = default
  43. return var
  44. def _get_var(self, name, conf_desc):
  45. hook, envvar, confvar, convert, append = conf_desc
  46. if convert is None:
  47. convert = lambda x: x
  48. var = self._hook_handler(name, hook)
  49. if envvar is not None:
  50. envvar_contents = os.environ.get(envvar)
  51. if envvar_contents is not None:
  52. envvar_contents = convert(envvar_contents)
  53. if var and append:
  54. if os.environ.get('NPY_DISTUTILS_APPEND_FLAGS', '0') == '1':
  55. var.extend(envvar_contents)
  56. else:
  57. var = envvar_contents
  58. if 'NPY_DISTUTILS_APPEND_FLAGS' not in os.environ.keys():
  59. msg = "{} is used as is, not appended ".format(envvar) + \
  60. "to flags already defined " + \
  61. "by numpy.distutils! Use NPY_DISTUTILS_APPEND_FLAGS=1 " + \
  62. "to obtain appending behavior instead (this " + \
  63. "behavior will become default in a future release)."
  64. warnings.warn(msg, UserWarning, stacklevel=3)
  65. else:
  66. var = envvar_contents
  67. if confvar is not None and self._conf:
  68. if confvar in self._conf:
  69. source, confvar_contents = self._conf[confvar]
  70. var = convert(confvar_contents)
  71. return var
  72. def clone(self, hook_handler):
  73. ec = self.__class__(distutils_section=self._distutils_section,
  74. **self._conf_keys)
  75. ec._hook_handler = hook_handler
  76. return ec
  77. def use_distribution(self, dist):
  78. if isinstance(dist, Distribution):
  79. self._conf = dist.get_option_dict(self._distutils_section)
  80. else:
  81. self._conf = dist