[Python-Dev] how to find the file path to an extension module at init time?

Stefan Behnel stefan_ml at behnel.de
Sun Nov 13 20:31:01 CET 2011


in Python modules, the "__file__" attribute is provided by the runtime 
before executing the module body. For extension modules, it is set only 
after executing the init function. I wonder if there's any way to figure 
out where an extension module is currently being loaded from. The 
_PyImport_LoadDynamicModule() function obviously knows it, but it does not 
pass that information on into the module init function.

I'm asking specifically because I'd like to properly implement __file__ in 
Cython modules at module init time. There are cases where it could be faked 
(when compiling modules on the fly during import), but in general, it's not 
known at compile time where a module will get installed and run from, so I 
currently don't see how to do it without dedicated runtime support. That's 
rather unfortunate, because it's not so uncommon for packages to look up 
bundled data files relative to their own position using __file__, and that 
is pretty much always done in module level code.

Another problem is that package local imports from __init__.py no longer 
work when it's compiled, likely because __path__ is missing on the new born 
module object in sys.modules. Here, it would also help if the path to the 
module (and to its package) was known early enough.

Any ideas how this could currently be achieved? Or could this become a new 
feature in the future?


More information about the Python-Dev mailing list