2008-09-23 4 views
7

파이썬에서는 논리 디렉토리를 가져 오거나 설정할 수 있습니다 (절대 디렉토리가 아닌).파이썬에서 논리 디렉토리 경로를 얻거나 설정하는 방법

/real/path/to/dir 

을 나는

/linked/path/to/dir 

같은 디렉토리에 링크가 있습니다 예를 들어

나는 경우. 항상 절대 경로

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

에게 나는 전혀이 문제를 해결 얻을 발견하는 유일한 방법을 사용합니다 os.getcwd 및 os.chdir를 사용하여

다른 프로세스에서 '비밀번호가'실행하고 출력을 읽는 것입니다 . 그러나 이것은 os.chdir을 처음 호출 할 때까지만 작동합니다.

답변

11

기본 운영 시스템/쉘은 파이썬에 대한 실제 경로를보고합니다.

따라서 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()는 자체 인수가 필요합니다 - 완벽하게 작동한다는 것 외! – Moe

+0

괜찮습니다. 고마워요. 고마워요. – nosklo

1

이 또한 나를 위해 트릭을 수행합니다 :

>>> 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' 

환경을 얻기 : 여기

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

파이썬 쉘에서 데모입니다

이 솔루션은 아래 모두 결합 변수 PWD는 항상 나를 위해 작동하지 않았으므로 popen 메서드를 사용합니다. 건배!