2016-08-18 11 views
0

Когда я запускаю следующий сценарийPython подпроцессов PWD непоследовательно, когда структура файла включает в себя псевдоним

#!/usr/bin/env python 
import subprocess 
print(subprocess.check_output(["pwd"])) 

результат

/scratch1/имя/Dropbox (NAM)/документы/исследования/У2/результаты/S8

в то время как от моего терминала Ubuntu, команда

pwd 

дает

/трясутся/дома/имя/документы/исследования/У2/Результаты/s8

, который является псевдонимом для первого пути. Почему они непоследовательны?

+0

Вы попробовали 'os.getcwd()'? – Frodon

+0

@Frodon Я просто попробовал. Результат будет таким же, как 'subprocess.check_output ([" pwd "])'. –

+0

как насчет 'os.environ ['PWD']'? – Frodon

ответ

1

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) для того, что уже предоставляет стандартная библиотека, например, получение текущего рабочего каталога.

+0

Может 'os.getcwd() '(или другой стандартный библиотечный метод), чтобы получить логический текущий рабочий каталог? (I.e. emulate 'pwd -L'). –

+0

Нет, 'os.getcwd()' не принимает аргументов, как вы можете видеть из документации. –

+0

Также смотрите: [Есть ли версия os.getcwd(), которая не вызывает разыменовывание символических ссылок?] (Http://stackoverflow.com/questions/1542803/is-there-a-version-of-os-getcwd- that-doesnt-dereference-symlinks) –

 Смежные вопросы

  • Нет связанных вопросов^_^