Как мне вернуться в исходный рабочий каталог с помощью Python?

У меня есть функция, похожая на приведенную ниже. Я не уверен, как использовать модуль 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)

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

Если вы поместите четыре пробела перед каждой строкой вашего кода, SO отформатирует его более красиво.

sep332 18.11.2008 20:22

Я только что исправил это для @Amara :) .. они использовали тег <pre> для открытия, но </code> в конце. Хотя теперь все чисто и счастливо: D

warren 18.11.2008 20:23

Также ответил в stackoverflow.com/questions/299249/….

S.Lott 18.11.2008 20:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
29
3
34 212
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

os.chdir(owd)

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

Принято к сведению. :) Я хотел убедиться, что мой вопрос был более конкретным и подробным, чтобы получить лучшую помощь, а также опубликовать образец кода, чтобы добавить немного ясности к моему вопросу.

Amara 18.11.2008 20:41

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

Совет использовать 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)

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

import os

os.getcwd()

os.chdir('C:\\')

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

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)

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

Спасибо за идею .call (cwd = ...)!

antimirov 14.09.2020 17:05

Контекстного менеджера для этой ситуации (выполнение системной команды) излишне. Лучшее решение - использовать вместо него модуль subprocess (начиная с Python 2.4) и методы run или popen с аргументом cwd.

Итак, ваш код можно заменить на:

def run(): 
    #run jar from test directory
    subprocess.run(cmd, cwd=testDir)

См. https://bugs.python.org/issue25625 и https://docs.python.org/3/library/subprocess.html#subprocess-replacements.

Другие вопросы по теме