Как мне изменить каталог обратно в исходный рабочий каталог с Python? - PullRequest
18 голосов
/ 18 ноября 2008

У меня есть функция, похожая на приведенную ниже. Я не уверен, как использовать модуль os, чтобы вернуться к исходному рабочему каталогу после завершения выполнения jar.

def run(): 
    owd = os.getcwd()
    #first change dir to build_dir path
    os.chdir(testDir)
    #run jar from test directory
    os.system(cmd)
    #change dir back to original working directory (owd)

примечание: я думаю, что мое форматирование кода отключено - не знаю почему. Мои извинения заранее

Ответы [ 5 ]

24 голосов
/ 23 июня 2016

Менеджер контекста является очень подходящим инструментом для этой работы:

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)

... что помешает вам вообще менять каталог переводчика.

20 голосов
/ 18 ноября 2008

Вам просто нужно добавить строку:

os.chdir(owd)

Просто примечание, на которое также был дан ответ на ваш вопрос .

10 голосов
/ 19 ноября 2008

Совет по использованию os.chdir(owd) хорош. Было бы разумно поместить код, которому требуется измененный каталог, в блок try:finally (или в python 2.6 и более поздних версиях, в блок with:). Это снижает риск того, что вы случайно вставите return в код до изменения обратно в исходный каталог.

def run(): 
    owd = os.getcwd()
    try:
        #first change dir to build_dir path
        os.chdir(testDir)
        #run jar from test directory
        os.system(cmd)
    finally:
        #change dir back to original working directory (owd)
        os.chdir(owd)
2 голосов
/ 18 ноября 2008

os.chdir (owd) должен сделать трюк (как вы делали при переходе на testDir)

1 голос
/ 11 мая 2011

Python чувствителен к регистру, поэтому при вводе пути убедитесь, что он совпадает с каталогом Вы хотите установить.

import os

os.getcwd()

os.chdir('C:\\')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...