(relative) import trouble, sometimes it works, sometimes it doesn't ...

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Mon Oct 20 21:26:23 EDT 2008


En Sat, 18 Oct 2008 05:52:04 -0300, Stef Mientki <stef.mientki at gmail.com>  
escribió:

> I'm running Python 2.5 and want my programs to run at least under  
> Windows and Linux (preferable also Mac).
> So I guess I should always use relative paths.
>
>  From most modules I can call a global function,
> that should import a dictionary from path deeper than the module itself.
> The import is done in the global function.
> In that global function, I get the modules path by
>
>   SourceFile = sys._getframe(1).f_code.co_filename

Why don't you let the caller tell you its own location, using __file__?  
The above code is too much magic for me.

> now to be sure to succeed the import (at least I was thinking this would  
> always be successful  :-(
> I need to
> 1- add the path of the module to be imported to sys.path
> (or do a dot import)

Yes.

> 2- keep track of already done imports, to give a reload the next time
> (or maybe always do an import followed by an reload ?)

A reload is only required if the module was changed on disk and you want  
to get the later version.

> Now what I don't understand is what relative path should I use in 1:
> - relative to the main application
> - relative to the working directory were I started the application
> - relative to the current working directory
> - relative to the module that is doing the import
> - relative to the module that called the global function

Relative imports assume you are inside a *package*, and they're relative  
to the current module location, each dot being one level above. See  
http://www.python.org/dev/peps/pep-0328/

> I would be pleased if someone could enlighten me,
> because this information is hard to find.

Yes. How import works is very poorly documented, unfortunately. You'll  
have to dig into the various PEPs and the bug tracker.

-- 
Gabriel Genellina




More information about the Python-list mailing list