view Python/frozen.c @ 86436:76184b5339f2

Issue #18416: Have importlib.machinery.PathFinder treat '' as the cwd and stop importlib.machinery.FileFinder treating '' as '.'. Previous PathFinder transformed '' into '.' which led to __file__ for modules imported from the cwd to always be relative paths. This meant the values of the attribute were wrong as soon as the cwd changed. This change now means that as long as the site module is run (which makes all entries in sys.path absolute) then all values for __file__ will also be absolute unless it's for __main__ when specified by file path in a relative way (modules imported by runpy will have an absolute path). Now that PathFinder is no longer treating '' as '.' it only makes sense for FileFinder to stop doing so as well. Now no transformation is performed for the directory given to the __init__ method. Thanks to Madison May for the initial patch.
author Brett Cannon <brett@python.org>
date Fri, 18 Oct 2013 11:39:04 -0400
parents a06fc2c2342a
children
line wrap: on
line source


/* Dummy frozen modules initializer */

#include "Python.h"
#include "importlib.h"

/* In order to test the support for frozen modules, by default we
   define a single frozen module, __hello__.  Loading it will print
   some famous words... */

/* To regenerate this data after the bytecode or marshal format has changed,
   go to ../Tools/freeze/ and freeze the flag.py file; then copy and paste
   the appropriate bytes from M___main__.c. */

static unsigned char M___hello__[] = {
    99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
    0,64,0,0,0,115,20,0,0,0,100,2,0,90,1,0,
    101,2,0,100,0,0,131,1,0,1,100,1,0,83,40,3,
    0,0,0,117,12,0,0,0,72,101,108,108,111,32,119,111,
    114,108,100,33,78,84,40,3,0,0,0,117,4,0,0,0,
    84,114,117,101,117,11,0,0,0,105,110,105,116,105,97,108,
    105,122,101,100,117,5,0,0,0,112,114,105,110,116,40,0,
    0,0,0,40,0,0,0,0,40,0,0,0,0,117,7,0,
    0,0,102,108,97,103,46,112,121,117,8,0,0,0,60,109,
    111,100,117,108,101,62,1,0,0,0,115,2,0,0,0,6,
    1,
};

#define SIZE (int)sizeof(M___hello__)

static const struct _frozen _PyImport_FrozenModules[] = {
    /* importlib */
    {"_frozen_importlib", _Py_M__importlib, (int)sizeof(_Py_M__importlib)},
    /* Test module */
    {"__hello__", M___hello__, SIZE},
    /* Test package (negative size indicates package-ness) */
    {"__phello__", M___hello__, -SIZE},
    {"__phello__.spam", M___hello__, SIZE},
    {0, 0, 0} /* sentinel */
};

/* Embedding apps may change this pointer to point to their favorite
   collection of frozen modules: */

const struct _frozen *PyImport_FrozenModules = _PyImport_FrozenModules;