Как узнать, когда вы находитесь в символической ссылке - PullRequest
4 голосов
/ 14 января 2009

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

У меня есть каталог / tmp / foo / kiwi

Я создаю символическую ссылку / tmp / bar , указывающую на / tmp / foo

Вхожу в / тпм / бар / киви

команда linux pwd сообщает мне, что я в / tmp / bar / kiwi , что правильно.

В командной строке python сообщается, что я нахожусь в / tmp / foo / kiwi :

Python 2.5.1 (r251:54863, Oct  5 2007, 13:36:32) 
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getcwd()
'/tmp/foo/kiwi'

Есть ли способ, в Python, получить каталог, в котором я действительно нахожусь?

Ответы [ 6 ]

6 голосов
/ 14 января 2009

Если вы не найдете ничего другого, вы можете использовать

os.getenv("PWD")

На самом деле это не переносимый метод python, но он работает в системах POSIX. Он получает значение переменной окружения PWD, которое задается командой cd (если вы не используете cd -P) для пути, по которому вы прошли (см. man cd) перед запуском сценария python , Эта переменная не изменяется Python, конечно. Поэтому, если вы os.chdir где-то еще, эта переменная сохранит свое значение.

В любом случае, как побочный узел, /tmp/foo/kiwi - это каталог, в котором вы находитесь. Я не уверен, знает ли что-нибудь кроме оболочки, что вы действительно прошли по другому пути в это место собственно :)

2 голосов
/ 14 января 2009

Если ваша символическая ссылка настроена так, как вы указали, тогда /tmp/foo/kiwi - это каталог, в котором вы действительно находитесь. /tmp/bar/kiwi - это просто еще один способ добраться до того же места.

Обратите внимание, что команда оболочки pwd -P даст вам физический путь к текущему каталогу. В вашем случае оболочка запоминает, что вы попали туда, где находитесь, через символическую ссылку bar, поэтому она сообщает вам, что вы находитесь в /tmp/bar/kiwi.

0 голосов
/ 14 января 2015

Вот еще один способ:

import os
os.popen('pwd').read().strip('\n')

Вот демонстрация в оболочке Python:

>>> import os
>>> os.popen('pwd').read().strip('\n')
'/home/projteam/staging/site/proj'
>>> # This returns actual path
>>> import subprocess
>>> p = subprocess.Popen('pwd', stdout=subprocess.PIPE)
>>> p.communicate()[0]  # returns non-symlink path
'/home/projteam/staging/deploys/20150114-141114/site/proj\n'

Получение переменной окружения PWD не всегда работает для меня, поэтому я использую метод popen. Ура!

0 голосов
/ 14 января 2009

Когда ваша оболочка возвращает путь, она полагается на переменную окружения оболочки "PWD", которая задается при прохождении по пути символической ссылки, но на самом деле она находится в каталоге, который возвращается getcwd (). Так что, если вы получите от PWD оболочки, вы получите то, что вы хотите.

>>> os.getcwd()
'/home/ors/foo/tmp/foo/kiwi'
>>> os.environ["PWD"]
'/home/ors/foo/tmp/bar/kiwi'
>>>
0 голосов
/ 14 января 2009

Вы также можете попробовать lstat. Он предоставит вам информацию о файле / директории, в том числе сообщит, является ли это ссылкой, и покажет, куда он ссылается, если он есть.

0 голосов
/ 14 января 2009

Интересно, что если вы находитесь в каталоге, вы можете использовать опцию -P, чтобы получить команду pwd для разрешения всех символических ссылок на их действительные каталоги.

$ ln -s Desktop toto
$ cd toto
$
$ pwd
/home/ken/toto
$ 
$ pwd -P
/home/ken/Desktop
$ 

НТН

ура

Rob

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...