Использование временного рабочего каталога на python - PullRequest
0 голосов
/ 31 октября 2018

Возможно ли на python установить рабочий каталог (os.chdir ('path')), как установить локальную переменную? Я имею в виду, можно ли использовать другой каталог только при вызове функции?

Т.е. у меня есть:

foo_function
    |
    module1---a.json
    |         |
    |         b.csv
    |
    module2---a.json
    |          |
    |         b.csv
    module3

Я хочу (пример):

my_path_1 = '/module1/'
my_path_2 = '/module2/'
def foo(a,b,my_path):
    os.chdir('my_path')
    os.mkdir('csv')
    os.mkdir('json')
    shutil.move(a+'.json','json')
    shutil.move(b+'.csv','csv')

А теперь, если я вызову, например, функцию B, которая удаляет module3, просто удаляет ее, а не использует новый каталог my_path для поиска module3 (последний вызов foo)

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

, если вы НЕ ДОЛЖНЫ менять каталог, лучше использовать абсолютные пути.

def foo(a,b,my_path):
    csv_dir = os.path.join(my_path, 'csv')
    json_dir = os.path.join(my_path, 'json')

    os.mkdir(csv_dir)
    os.mkdir(json_dir)

    shutil.move(os.path.join(my_path, a+'.json'), json_dir)
    shutil.move(os.path.join(my_path, b+'.csv'),' csv_dir)
0 голосов
/ 31 октября 2018

Вы можете создать менеджер контекста, чтобы сделать это:

@contextlib.contextmanager
def temp_chdir(path):
    prev = os.getcwd()
    os.chdir(path)
    try:
        yield
    finally:
        os.chdir(prev)

 with temp_chdir("~/some_dir"):
    funcion_a()

или сделай декоратор

def chdir_dec(path):

    def decorator(fn):
        @wraps(fn)
        def _fn(*args, **kwargs):
            with temp_chdir(path):
                return fn(*args, **kwargs)
        return _fn

    return decorator

# example ... 

@chdir_dec('../some_path')
def function_a():
    os.system("ls")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...