Менеджер контекста является очень подходящим инструментом для этой работы:
from contextlib import contextmanager
@contextmanager
def cwd(path):
oldpwd=os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(oldpwd)
... используется как:
os.chdir('/tmp') # for testing purposes, be in a known directory
print 'before context manager: %s' % os.getcwd()
with cwd('/'):
# code inside this block, and only inside this block, is in the new directory
print 'inside context manager: %s' % os.getcwd()
print 'after context manager: %s' % os.getcwd()
... что даст что-то вроде:
before context manager: /tmp
inside context manager: /
after context manager: /tmp
Это на самом деле превосходит по сравнению со встроенной оболочкой cd -
, поскольку оно также заботится о смене каталогов обратно при выходе из блока из-за создаваемого исключения.
Для вашего конкретного случая использования это будет:
with cwd(testDir):
os.system(cmd)
Другой вариант, который следует рассмотреть, - это использование subprocess.call()
вместо os.system()
, что позволит вам указать рабочий каталог для запуска команды:
# note: better to modify this to not need shell=True if possible
subprocess.call(cmd, cwd=testDir, shell=True)
... что помешает вам вообще менять каталог переводчика.