代码之家  ›  专栏  ›  技术社区  ›  Moe

如何在python中获取/设置逻辑目录路径

  •  10
  • Moe  · 技术社区  · 17 年前

    在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之前有效。

    2 回复  |  直到 16 年前
        1
  •  13
  •   nosklo    17 年前

    底层操作系统/shell报告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.
    
        2
  •  1
  •   radtek    11 年前

    这对我来说也很有用:

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

    以下是python shell中的演示:

    >>> 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方法。干杯