Browse Source

Added workaround for Python 3.3's frozen loader

pull/1013/merge
Armin Ronacher 11 years ago
parent
commit
9554844e2a
  1. 1
      CHANGES
  2. 38
      flask/helpers.py

1
CHANGES

@ -23,6 +23,7 @@ Version 1.0
- Added ``TEMPLATES_AUTO_RELOAD`` config key. If disabled the - Added ``TEMPLATES_AUTO_RELOAD`` config key. If disabled the
templates will be reloaded only if the application is running in templates will be reloaded only if the application is running in
debug mode. For higher performance it’s possible to disable that. debug mode. For higher performance it’s possible to disable that.
- Added a workaround for a limitation in Python 3.3's namespace loader.
Version 0.10.2 Version 0.10.2
-------------- --------------

38
flask/helpers.py

@ -656,6 +656,29 @@ def get_root_path(import_name):
return os.path.dirname(os.path.abspath(filepath)) return os.path.dirname(os.path.abspath(filepath))
def _matching_loader_thinks_module_is_package(loader, mod_name):
"""Given the loader that loaded a module and the module this function
attempts to figure out if the given module is actually a package.
"""
# If the loader can tell us if something is a package, we can
# directly ask the loader.
if hasattr(loader, 'is_package'):
return loader.is_package(mod_name)
# importlib's namespace loaders do not have this functionality but
# all the modules it loads are packages, so we can take advantage of
# this information.
elif (loader.__module__ == '_frozen_importlib' and
loader.__name__ == 'NamespaceLoader'):
return True
# Otherwise we need to fail with an error that explains what went
# wrong.
raise AttributeError(
('%s.is_package() method is missing but is required by Flask of '
'PEP 302 import hooks. If you do not use import hooks and '
'you encounter this error please file a bug against Flask.') %
loader.__class__.__name__)
def find_package(import_name): def find_package(import_name):
"""Finds a package and returns the prefix (or None if the package is """Finds a package and returns the prefix (or None if the package is
not installed) as well as the folder that contains the package or not installed) as well as the folder that contains the package or
@ -685,14 +708,13 @@ def find_package(import_name):
__import__(import_name) __import__(import_name)
filename = sys.modules[import_name].__file__ filename = sys.modules[import_name].__file__
package_path = os.path.abspath(os.path.dirname(filename)) package_path = os.path.abspath(os.path.dirname(filename))
# package_path ends with __init__.py for a package
if hasattr(loader, 'is_package'): # In case the root module is a pcakage we need to chop of the
if loader.is_package(root_mod_name): # rightmost part. This needs to go through a helper function
package_path = os.path.dirname(package_path) # because of python 3.3 namespace packages.
else: if _matching_loader_thinks_module_is_package(
raise AttributeError( loader, root_mod_name):
('%s.is_package() method is missing but is ' package_path = os.path.dirname(package_path)
'required by Flask of PEP 302 import hooks') % loader.__class__.__name__)
site_parent, site_folder = os.path.split(package_path) site_parent, site_folder = os.path.split(package_path)
py_prefix = os.path.abspath(sys.prefix) py_prefix = os.path.abspath(sys.prefix)

Loading…
Cancel
Save