Organising packages/modules - importing functions from a common.py in a separate directory?

Victor Hooi victorhooi at gmail.com
Mon Oct 28 20:51:34 EDT 2013


Hi,

Ok, so I should be using absolute imports, not relative imports.

Hmm, I just tried to use absolute imports, and it can't seem to locate the modules:

In the file "foo_loading/em_load/sync_em.py", I have:

    from common.common_bex import setup_foo_logging

When I try to run that script:

    python sync_em.py

I get:

    ImportError: No module named common.common_foo

I've also tried adding "foo_loading" (the package name):

    from foo_loading.common.common_bex import setup_foo_logging

Same error:

    ImportError: No module named foo_loading.common.bex_common

Any thoughts?

Cheers,
Victor

On Tuesday, 29 October 2013 00:12:58 UTC+11, Jean-Michel Pichavant  wrote:
> ----- Original Message -----
> > Hi,
> > 
> > I have a collection of Python scripts I'm using to load various bits
> > of data into a database.
> > 
> > I'd like to move some of the common functions (e.g. to setup loggers,
> > reading in configuration etc.) into a common file, and import them
> > from there.
> > 
> > I've created empty __init__.py files, and my current directory
> > structure looks something like this:
> > 
> > foo_loading/
> >     __init__.py
> >     common/
> >         common_foo.py
> >     em_load/
> >         __init__.py
> >         config.yaml
> >         sync_em.py
> >     pg_load/
> >         __init__.py
> >         config.yaml
> >         sync_pg.py
> > 
> > So from within the sync_em.py script, I'm trying to import a function
> > from foo_loading/common/common_foo.py.
> > 
> >     from ..common.common_foo import setup_foo_logging
> > 
> > I get the error:
> > 
> >     ValueError: Attempted relative import in non-package
> > 
> > If I change directories to the parent of "foo_loading", then run
> > 
> >     python -m foo_loading.em_load.sync_em sync_em.py
> > 
> > it works. However, this seems a bit roundabout, and I suspect I'm not
> > doing things correctly.
> > 
> > Ideally, I want a user to be able to just run sync_em.py from it's
> > own directory, and have it correctly import the logging/config
> > modules from common_foo.py, and just work.
> > 
> > What is the correct way to achieve this?
> > 
> > Secondly, if I want to move all of the config.yaml files to a common
> > foo_loading/config.yaml, or even foo_loading/config/config.yaml,
> > what is the correct way to access this from within the scripts?
> > Should I just be using "../", or is there a better way?
> > 
> > Cheers,
> > Victor
> 
> Long story short : use absolute imports.
> 
> name properly your module with a distinct name and import that way, even inside your package:
> 
> import foo_loading.common.common_foo
> 
> Names like common, lib, setup are farely prone to collision with other badly referenced import from other modules. One way to solve this is to use a distinct namespace, in other words, prefix every import with the module name.
> 
> cheers,
> 
> JM
> 
> 
> -- IMPORTANT NOTICE: 
> 
> The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.



More information about the Python-list mailing list