Skip to content

Instantly share code, notes, and snippets.

@supplient
Created September 30, 2022 07:34
Show Gist options
  • Save supplient/3e975baf97d3516f7a8e14b832193331 to your computer and use it in GitHub Desktop.
Save supplient/3e975baf97d3516f7a8e14b832193331 to your computer and use it in GitHub Desktop.
Get an imported module's qualified name by its file path.
_path2modname = {}
def Filepath2ModuleName(filepath):
''' Get an imported module's qualified name by its file path.
Return `None` if the module is not found or is not imported.
## Usage
``` python
from pkg import mod
mod_name = Filepath2ModuleName("./pkg/mod.py")
assert(mod_name == mod.__name__)
assert(mod_name == "pkg.mod")
```
## Implementation
Just iterate each module in `sys.modules`.
So the module must have been imported.
A memo var `_path2modname` is used to avoid duplicate searching.
'''
name: str = _path2modname.get(filepath, None)
if not name is None:
return name
import os.path
import sys
name: str = None
for k_name, mod in sys.modules.items():
k_path = getattr(mod, "__file__", None)
if k_path is None:
continue
if os.path.samefile(mod.__file__, filepath):
name = k_name
break
if not name is None:
_path2modname[filepath] = name
return name
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment