2015-06-04 2 views
2

Я пытаюсь расширить относительный путь в абсолютный путь. Иногда относительный путь включает в себя ., который необходимо будет расширить из текущего рабочего каталога. Мне было интересно, согласны ли какие-либо стандартные функции в Python с cwd kwarg, например subprocess.popen.Можете ли вы установить cwd для abspath?

Оптимальное решение

abs_path = os.path.abspath(rel_path, cwd=special_cwd) 

Текущее решение

# Capture current working directory 
previous_cwd = os.getcwd() 

# Change to the new working directory 
os.chdir(new_cwd) 

# Convert relative path to absolute path 
abs_path = os.path.abspath(rel_path) 

# Change back to previous working directory 
os.chdir(previous_cwd) 

Текущее решение кажется неуклюжим, есть лучший способ сделать это?

+0

Какую версию Python являются вы используете? –

+0

Я использую Python 3.4 –

+1

На основе документов 'abspath' чаще всего совпадает с' normpath (join (os.getcwd(), path)) '. Так не будет ли это 'normpath (join (new_cwd, path))'? –

ответ

1

Текущее решение кажется неуклюжим, есть ли лучший способ достичь этого?

Вы можете написать свой собственный код в качестве context manager, который изменяет каталог, а затем изменяется обратно:

>>> from contextlib import contextmanager 

>>> @contextmanager 
... def cwd(path): 
...  from os import getcwd, chdir 
...  cwd = getcwd() 
...  chdir(path) 
...  yield 
...  chdir(cwd) 

то фактический код будет выглядеть намного чище:

>>> os.getcwd() 
'/home/user' 

>>> with cwd('/usr/share'): 
...  print(os.path.abspath('./test')) 
... 
/usr/share/test 

>>> os.getcwd() 
'/home/user' 
Смежные вопросы