How do I change directory back to my original working directory with Python?

A context manager is a very appropriate tool for this job:

from contextlib import contextmanager
import os

@contextmanager
def cwd(path):
    oldpwd = os.getcwd()
    os.chdir(path)
    try:
        yield
    finally:
        os.chdir(oldpwd)

…used as:

os.chdir('/tmp') # for testing purposes, be in a known directory
print(f'before context manager: {os.getcwd()}')
with cwd("https://stackoverflow.com/"):
    # code inside this block, and only inside this block, is in the new directory
    print(f'inside context manager: {os.getcwd()}')

print(f'after context manager: {os.getcwd()}')

…which will yield something like:

before context manager: /tmp
inside context manager: /
after context manager: /tmp

This is actually superior to the cd - shell builtin, inasmuch as it also takes care of changing directories back when a block is exited due to an exception being thrown.


For your specific use case, this would instead be:

with cwd(testDir):
    os.system(cmd)

Another option to consider is using subprocess.call() instead of os.system(), which will let you specify a working directory for the command to run:

# note: better to modify this to not need shell=True if possible
subprocess.call(cmd, cwd=testDir, shell=True)

… which would prevent you from needing to change the interpreter’s directory at all.

Note that now it is recommended to use subprocess.run (instead of call) but the same arguments are available, and in particular cwd: https://docs.python.org/3/library/subprocess.html#using-the-subprocess-module.

Leave a Comment