【问题标题】:How to get/set logical directory path in python如何在python中获取/设置逻辑目录路径
【发布时间】:2010-09-12 13:03:14
【问题描述】:

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

【问题讨论】:

    标签: python path symlink


    【解决方案1】:

    底层操作系统/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】:

      这对我也有用:

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

      【讨论】:

        猜你喜欢
        • 2012-10-22
        • 2020-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-28
        • 1970-01-01
        • 2020-12-06
        相关资源
        最近更新 更多