Search code examples
pythonpip

How to detect if module is installed in "editable mode"?


I'm pip-installing my module like so:

cd my_working_dir
pip install -e .

When I later import the module from within Python, can I somehow detect if the module is installed in this editable mode?

Right now, I'm just checking if there's a .git folder in os.path.dirname(mymodule.__file__)) which, well, only works if there's actually a .git folder there. Is there a more reliable way?


Solution

  • I don't know of a way to detect this directly (e.g. ask setuptools).

    You could try to detect that you package can not be reached through the paths in sys.path. But that's tedious. It's also not bullet proof -- what if it can be reached through sys.path but it's also installed as en editable package?

    The best option is to look at the artifacts an editable install leaves in your site-packages folder. There's a file called my_package.egg-link there.

    from pathlib import Path
    
    # get site packages folder through some other magic
    
    # assuming this current file is located in the root of your package
    current_package_root = str(Path(__file__).parent.parent)
    
    installed_as_editable  = False
    egg_link_file = Path(site_packages_folder) / "my_package.egg-link"
    try:
        linked_folder = egg_link_file.read_text()
        installed_as_editable = current_package_root in linked_folder
    except FileNotFoundError:
        installed_as_editable = False
    

    Note: to make this a bit more bullet-proof, read only the first line of the egg-link file and parse it using Path() as well to account for proper slashes etc.