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

标签 python path symlink

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

最佳答案

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

关于python - 如何在python中获取/设置逻辑目录路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/123958/

相关文章:

windows - 忽略 git 中的符号链接(symbolic link)

linux - 指向其父目录没有执行权限的文件夹的符号链接(symbolic link)

python - 如果存在则写入文件,如果不存在则创建文件

python - 如果 TCP 客户端能够暂停服务器,当 TCP 服务器读取非阻塞套接字时

python - tensorflow :在两个单独的图中初始化的两个模型,但它们仅在最后一张图中看到

linux - 查找路径不包含单词的文件

python - 使用 python、pyodbc 从 csv 转义列名写入 SQL

string - 如何使用python添加\\字符串

android - 如何使用 canvas.. 在 onDraw() 中使用 path() 设置起点?

php - 为什么 PHP 在启用 SELinux 的情况下不遵循符号链接(symbolic link)?