Как получить/установить логический путь каталога в python


7

В python можно получить или установить логический каталог (в отличие от абсолютного).

Например, если у меня есть:

/real/path/to/dir 

и я

/linked/path/to/dir 

связаны с одной и той же директории.

использованием os.getcwd и os.chdir всегда будет использовать абсолютный путь

>>> import os 
>>> os.chdir('/linked/path/to/dir') 
>>> print os.getcwd() 
/real/path/to/dir 

Единственный способ я нашел, чтобы обойти это вовсе запустить «PWD» в другом процессе и читать вывод , Однако это работает до тех пор, пока вы не вызовете os.chdir в первый раз.

11

Основная операционная система/оболочка сообщает реальные пути к python.

Итак, там действительно нет способа, так как os.getcwd() - это завернутый звонок в библиотеку C getcwd().

Есть некоторые обходные пути в духе того, что вы уже знаете, который запускает pwd.

Другим будет использование os.environ['PWD']. Если эта переменная среды установлена, вы можете сделать некоторую функцию getcwd, которая ее уважает.

Раствор ниже сочетает в себе:

import os 
from subprocess import Popen, PIPE 

class CwdKeeper(object): 
    def __init__(self): 
     self._cwd = os.environ.get("PWD") 
     if self._cwd is None: # no environment. fall back to calling pwd on shell 
      self._cwd = Popen('pwd', stdout=PIPE).communicate()[0].strip() 
     self._os_getcwd = os.getcwd 
     self._os_chdir = os.chdir 

    def chdir(self, path): 
     if not self._cwd: 
      return self._os_chdir(path) 
     p = os.path.normpath(os.path.join(self._cwd, path)) 
     result = self._os_chdir(p) 
     self._cwd = p 
     os.environ["PWD"] = p 
     return result 

    def getcwd(self): 
     if not self._cwd: 
      return self._os_getcwd() 
     return self._cwd 

cwd = CwdKeeper() 
print cwd.getcwd() 
# use only cwd.chdir and cwd.getcwd from now on.  
# monkeypatch os if you want: 
os.chdir = cwd.chdir 
os.getcwd = cwd.getcwd 
# now you can use os.chdir and os.getcwd as normal. 
  0

Спасибо! getcwd() нуждается в собственном аргументе - кроме того, что он отлично работает! 23 сен. 082008-09-23 21:50:47

  0

хорошо, исправлено, спасибо. 23 сен. 082008-09-23 23:09:47


1

Это также делает трюк для меня:

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

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

>>> import os 
>>> os.popen('pwd').read() 
'/home/projteam/staging/site/proj\n' 
>>> os.popen('pwd').read().strip('\n') 
'/home/projteam/staging/site/proj' 
>>> # Also works if PWD env var is set 
>>> os.getenv('PWD') 
'/home/projteam/staging/site/proj' 
>>> # This gets actual path, not symlinked 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. Ура!