Вы можете отслеживать пути в локальных переменных и использовать их по мере необходимости. pathlib
предлагает удобный класс-оболочку для этого.
>>> from pathlib import Path
>>> project_path = Path("project_name")
>>> project_path
PosixPath('project_name')
>>> str(project_path)
'project_name'
Вы можете перечислить
>>> print(list(project_path.iterdir()))
[PosixPath('project_name/app1'), PosixPath('project_name/app2')]
И сделать подпути
>>> app1_path = project_path.joinpath("app1")
>>> app1_path
PosixPath('project_name/app1')
>>> str(app1_path)
'project_name/app1'
Вы все еще можете запускать команды с os.system
(обратите внимание на точку с запятой, разделяющую две команды)
>>> import os
>>> rc = os.system(f"cd {app1_path};ls")
foo some_file
или используйте модуль подпроцесса, который позволяет вам указать текущий рабочий каталог
>>> import subprocess as subp
>>> rc = subp.run("ls", shell=True, cwd=app1_path)
foo some_file
Код, который в одностороннем порядке изменяет путь, может быть сложным читать. И легко заблудиться и работать не в том каталоге.