Trying to understand 'import' a bit better

Jean-Michel Pichavant jeanmichel at sequans.com
Mon Mar 5 05:40:26 EST 2012


Frank Millman wrote:
> Hi all
>
> I have been using 'import' for ages without particularly thinking about it - 
> it just works.
>
> Now I am having to think about it a bit harder, and I realise it is a bit 
> more complicated than I had realised - not *that* complicated, but there are 
> some subtleties.
>
> I don't know the correct terminology, but I want to distinguish between the 
> following two scenarios -
>
> 1. A python 'program', that is self contained, has some kind of startup, 
> invokes certain functionality, and then closes.
>
> 2. A python 'library', that exposes functionality to other python programs, 
> but relies on the other program to invoke its functionality.
>
> The first scenario has the following characteristics -
>   - it can consist of a single script or a number of modules
>   - if the latter, the modules can all be in the same directory, or in one 
> or more sub-directories
>   - if they are in sub-directories, the sub-directory must contain 
> __init__.py, and is referred to as a sub-package
>   - the startup script will normally be in the top directory, and will be 
> executed directly by the user
>
> When python executes a script, it automatically places the directory 
> containing the script into 'sys.path'. Therefore the script can import a 
> top-level module using 'import <module>', and a sub-package module using 
> 'import <sub-package>.<module>'.
>
> The second scenario has similar characteristics, except it will not have a 
> startup script. In order for a python program to make use of the library, it 
> has to import it. In order for python to find it, the directory containing 
> it has to be in sys.path. In order for python to recognise the directory as 
> a valid container, it has to contain __init__.py, and is referred to as a 
> package.
>
> To access a module of the package, the python program must use 'import 
> <package>.<module>' (or 'from <package> import <module>'), and to access a 
> sub-package module it must use 'import <package>.<sub-package>.<module>.
>
> So far so uncontroversial (I hope).
>
> The subtlety arises when the package wants to access its own modules. 
> Instead of using 'import <module>' it must use 'import <package>.<module>'. 
> This is because the directory containing the package is in sys.path, but the 
> package itself is not. It is possible to insert the package directory name 
> into sys.path as well, but as was pointed out recently, this is dangerous, 
> because you can end up with the same module imported twice under different 
> names, with potentially disastrous consequences.
>
> Therefore, as I see it, if you are developing a project using scenario 1 
> above, and then want to change it to scenario 2, you have to go through the 
> entire project and change all import references by prepending the package 
> name.
>
> Have I got this right?
>
> Frank Millman
>
>
>
>   
I think you got it right. It happened to me as well, I guess it's a 
classic for program  being promoted into a library.

JM



More information about the Python-list mailing list