How to Find the File Path of a Class in Python
Often you'll need to programmatically determine the file in which a class is defined.
This guide explores various methods for obtaining the file path of a class in Python, including techniques using inspect.getfile()
, os.path.abspath()
, and handling cases where you only have access to an instance of the class.
Getting the File Path with inspect.getfile()
The inspect.getfile()
method is the most direct and reliable way to get the file path of a class:
import inspect
from another import Employee # Assume Employee class is in another.py
print(inspect.getfile(Employee)) # Output (Depends on file location): /path/to/another.py
- The
inspect.getfile()
returns the path to the module or source file that defined the class.
Using a Class Instance
If you only have an instance of the class, you can access its class type and then use inspect.getfile()
:
import inspect
from another import Employee # Assume Employee class is in another.py
emp1 = Employee()
print(inspect.getfile(emp1.__class__)) # Output (Depends on file location): /path/to/another.py
# Alternative using type()
print(inspect.getfile(type(emp1))) # Output (Depends on file location): /path/to/another.py
- Accessing the
__class__
attribute (or usingtype()
) provides access to the class object, whichinspect.getfile()
can then use to get the file path.
Getting a Relative Path
To get a relative file path (relative to the current working directory), use os.path.relpath()
:
import inspect
import os
from another import Employee # Assume Employee class is in another.py
print(os.path.relpath(inspect.getfile(Employee))) # Output: another.py (if in the same directory)
- The call to
os.path.relpath()
will return the location of the file, relative to where you run the python script, or a different specified directory with thestart
argument.
Getting the File Path with os.path.abspath()
You can construct the absolute path manually:
import os
import sys
from another import Employee # Assume Employee class is in another.py
result = os.path.abspath(sys.modules[Employee.__module__].__file__)
print(result) # Output (Depends on file location): /path/to/another.py
Employee.__module__
gets the name of the module where the class is defined.sys.modules[Employee.__module__]
retrieves the module object.__file__
is a module attribute that gives you the absolute file path, and it is then passed toos.path.abspath()
to normalize the output.