TL; DR - Используйте os.getcwd()
Вы можете использовать os.path.realpath
превратить путь, содержащий символьные ссылки на физический путь, решая любые символические ссылки:
~/src/stackoverflow $ mkdir targetdir
~/src/stackoverflow $ ln -s targetdir symlink
~/src/stackoverflow $ cd symlink
~/src/stackoverflow/symlink $
~/src/stackoverflow/symlink $ python
>>> import os
>>> import subprocess
>>> import shlex
>>>
>>> path = subprocess.check_output('pwd').strip()
>>> path
'/Users/lukasgraf/src/stackoverflow/symlink'
>>> os.path.realpath(path)
'/Users/lukasgraf/src/stackoverflow/targetdir'
Существует также -P
команда pwd
, которая обеспечивает это.
На странице pwd
людей (на OS X):
PWD утилита записывает абсолютный путь текущего рабочего каталога на стандартный вывод.
Некоторые оболочки могут содержать встроенную команду pwd, которая аналогична или идентична этой утилите. Обратитесь к странице справки builtin (1).
The options are as follows:
-L Display the logical current working directory.
-P Display the physical current working directory (all symbolic
links resolved).
If no options are specified, the -L option is assumed.
Так это будет работать тоже:
>>> subprocess.check_output(shlex.split('pwd -P'))
'/Users/lukasgraf/src/stackoverflow/targetdir\n'
>>>
Однако, лучшим вариантом является использование os.getcwd()
из стандартной библиотеки Python:
>>> os.getcwd()
'/Users/lukasgraf/src/stackoverflow/targetdir'
Это явно не задокументировано, но, похоже, оно уже разрешает символические ссылки для вас. В любом случае вам нужно избегать обхода (используя subprocess
) для того, что уже предоставляет стандартная библиотека, например, получение текущего рабочего каталога.
Вы попробовали 'os.getcwd()'? – Frodon
@Frodon Я просто попробовал. Результат будет таким же, как 'subprocess.check_output ([" pwd "])'. –
как насчет 'os.environ ['PWD']'? – Frodon