У меня есть функция, похожая на приведенную ниже. Я не уверен, как использовать модуль 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)
примечание: я думаю, что у меня отключено форматирование кода - не знаю почему. Мои извинения заранее
Я только что исправил это для @Amara :) .. они использовали тег <pre> для открытия, но </code> в конце. Хотя теперь все чисто и счастливо: D
Также ответил в stackoverflow.com/questions/299249/….






Вам просто нужно добавить строку:
os.chdir(owd)
Просто примечание, на это также ответили в другом вашем вопрос.
Принято к сведению. :) Я хотел убедиться, что мой вопрос был более конкретным и подробным, чтобы получить лучшую помощь, а также опубликовать образец кода, чтобы добавить немного ясности к моему вопросу.
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 = ...)!
Контекстного менеджера для этой ситуации (выполнение системной команды) излишне. Лучшее решение - использовать вместо него модуль 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.
Если вы поместите четыре пробела перед каждой строкой вашего кода, SO отформатирует его более красиво.