Last updated: Apr 10, 2024
Reading time·4 min
pathlib.Path
os.curdir
constant to get the root project directoryTo get the path of the root project directory:
os.path.abspath()
method to get a normalized absolute path to the
current file.os.path.dirname()
method to get the directory name of the path.For example, suppose we have the following project structure.
my-project/ └── main.py └── another.py └── example.txt
You can add the following code to main.py
to get the path to the root project
directory.
import os # 👇️ /home/borislav/Desktop/bobbyhadz_python/main.py print(__file__) ROOT_DIR = os.path.dirname( os.path.abspath(__file__) ) # 👇️ /home/borislav/Desktop/bobbyhadz_python print(ROOT_DIR)
The __file__
variable is set to the module's path.
We used the os.path.abspath() to get a normalized absolute version of the path.
The last step is to pass the absolute path to the os.path.dirname() method.
The method returns the directory name of the supplied path.
Since our main.py
file is located in the root directory of the project, the
ROOT_DIR
variable stores the path to the project's root directory.
If your file is located one directory deep, you can call os.path.dirname()
two
times.
For example, suppose you have the following folder structure.
my-project/ src/ └── constants.py
import os ROOT_DIR = os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ) # 👇️ /home/borislav/Desktop/bobbyhadz_python print(ROOT_DIR)
Notice that we called the os.path.dirname()
method twice to get the root
project directory, because the constants
file is located in a nested
directory.
The same approach can be used to get the path to a file that's located in the project's root directory.
Suppose we have the following folder structure and we want to get the path to
the example.txt
file.
my-project/ └── main.py └── another.py └── example.txt
You have to pass the ROOT_DIR
variable and the example.txt
string to the
os.path.join()
method to combine the two paths.
import os ROOT_DIR = os.path.dirname( os.path.abspath(__file__) ) # 👇️ /home/borislav/Desktop/bobbyhadz_python print(ROOT_DIR) PATH_TO_FILE_IN_ROOT_DIR = os.path.join(ROOT_DIR, 'example.txt') # 👇️ /home/borislav/Desktop/bobbyhadz_python/example.txt print(PATH_TO_FILE_IN_ROOT_DIR)
The os.path.join() method takes a path and one or more path segments and joins them intelligently.
The method returns the concatenation of the supplied path and path segments.
You can store your ROOT_DIR
variable in a file from which you import your
constants and import it into other files.
Suppose we have the following folder structure.
my-project/ └── main.py └── another.py └── example.txt
This is the code for the main.py
file where the ROOT_DIR
variable is
defined.
import os ROOT_DIR = os.path.dirname( os.path.abspath(__file__) ) # 👇️ /home/borislav/Desktop/bobbyhadz_python print(ROOT_DIR) PATH_TO_FILE_IN_ROOT_DIR = os.path.join(ROOT_DIR, 'example.txt') # 👇️ /home/borislav/Desktop/bobbyhadz_python/example.txt print(PATH_TO_FILE_IN_ROOT_DIR)
Here is how you can import the ROOT_DIR
and PATH_TO_FILE_IN_ROOT_DIR
variables into a different file.
from main import ROOT_DIR, PATH_TO_FILE_IN_ROOT_DIR # 👇️ /home/borislav/Desktop/bobbyhadz_python print(ROOT_DIR) # 👇️ /home/borislav/Desktop/bobbyhadz_python/example.txt print(PATH_TO_FILE_IN_ROOT_DIR)
The another.py
module is located in the same directory as the main.py
file
that defines the ROOT_DIR
variable.
pathlib.Path
You can also use the Path
class from the pathlib
module to get the path to
the root project directory.
Suppose we have the following folder structure.
my-project/ └── main.py └── src/ └── constants.py
Here is the code for constants.py
.
from pathlib import Path def get_project_root_dir(): return Path(__file__).absolute().parent.parent
The module uses the pathlib.Path()
class to get the absolute path to the
current module and uses the parent
attribute to get the logical parent of the
path.
Now you can import and use the get_project_root_dir
function into your
main.py
file.
from src.constants import get_project_root_dir ROOT_DIR = get_project_root_dir() # 👇️ /home/borislav/Desktop/bobbyhadz_python print(ROOT_DIR)
Here is an example that better illustrates how the parent
attribute works.
from pathlib import Path abs_path = Path(__file__).absolute() # /home/borislav/Desktop/bobbyhadz_python/main.py print(abs_path) print(abs_path.parent) # 👉️ /home/borislav/Desktop/bobbyhadz_python print(abs_path.parent.parent) # 👉️ /home/borislav/Desktop print(abs_path.parent.parent.parent) # 👉️ /home/borislav
You can access the parent
attribute multiple times to get the logical parent
of each path.
Accessing the attribute once removes the filename.
The second time you access the attribute, the folder that contains the file is removed and so on.
This approach can be made more flexible by using a generator expression that looks for the root directory by name.
from pathlib import Path current_dir = Path(__file__) PROJECT_NAME = 'bobbyhadz_python' ROOT_DIR = next( p for p in current_dir.parents if p.parts[-1] == PROJECT_NAME ) # 👇️ /home/borislav/Desktop/bobbyhadz_python print(ROOT_DIR)
Notice that you have to specify the name of your project.
In my case, the project is named bobbyhadz-python
.
The generator expression iterates over the parent directories and checks if the last part of each parent directory is equal to the project name.
If the condition is met, then we are in the root directory of the project.
os.curdir
constant to get the root project directoryIf you run your Python script from the root project folder, you can also:
os.curdir
attribute to get a string that is used to refer to the
current directory.os.path.abspath()
method.import os ROOT_DIR = os.path.abspath(os.curdir) # 👇️ /home/borislav/Desktop/bobbyhadz_python print(ROOT_DIR)
The code sample assumes that your main.py
module is placed in the root
directory of your project and you run the file from the same directory.
I've also written an article on how to get the last part of a Path in Python.
You can learn more about the related topics by checking out the following tutorials: