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

AltStyle によって変換されたページ (->オリジナル) /