pythonpython-3.ximportshared-librariesrelative-path

Importing from a relative path in Python


I have a folder for my client code, a folder for my server code, and a folder for code that is shared between them

Proj/
    Client/
        Client.py
    Server/
        Server.py
    Common/
        __init__.py
        Common.py

How do I import Common.py from Server.py and Client.py?


Solution

  • EDIT Nov 2014 (3 years later):

    Python 2.6 and 3.x supports proper relative imports, where you can avoid doing anything hacky. With this method, you know you are getting a relative import rather than an absolute import. The '..' means, go to the directory above me:

    from ..Common import Common
    

    As a caveat, this will only work if you run your python as a module, from outside of the package. For example:

    python -m Proj
    

    Original hacky way

    This method is still commonly used in some situations, where you aren't actually ever 'installing' your package. For example, it's popular with Django users.

    You can add Common/ to your sys.path (the list of paths python looks at to import things):

    import sys, os
    sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'Common'))
    import Common
    

    os.path.dirname(__file__) just gives you the directory that your current python file is in, and then we navigate to 'Common/' the directory and import 'Common' the module.