Search code examples
pythonmodulepackage

How to reference to the top-level module in Python inside a package?


In the below hierachy, is there a convenient and universal way to reference to the top_package using a generic term in all .py file below? I would like to have a consistent way to import other modules, so that even when the "top_package" changes name nothing breaks.

I am not in favour of using the relative import like "..level_one_a" as relative path will be different to each python file below. I am looking for a way that:

  1. Each python file can have the same import statement for the same module in the package.
  2. A decoupling reference to "top_package" in any .py file inside the package, so whatever name "top_package" changes to, nothing breaks.

    top_package/
      __init__.py
      level_one_a/
        __init__.py
        my_lib.py
        level_two/
          __init__.py
          hello_world.py
      level_one_b/
        __init__.py
        my_lib.py
      main.py
    

Solution

  • This should do the job:

    top_package = __import__(__name__.split('.')[0])
    

    The trick here is that for every module the __name__ variable contains the full path to the module separated by dots such as, for example, top_package.level_one_a.my_lib. Hence, if you want to get the top package name, you just need to get the first component of the path and import it using __import__.

    Despite the variable name used to access the package is still called top_package, you can rename the package and if will still work.