Created
September 30, 2022 07:34
-
-
Save supplient/3e975baf97d3516f7a8e14b832193331 to your computer and use it in GitHub Desktop.
Get an imported module's qualified name by its file path.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
_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