10

假设我有一个名为:

/this/is/a/real/path

现在,我为它创建一个符号链接:

/this/is/a/link  -> /this/is/a/real/path

然后,我将文件放入此路径:

/this/is/a/real/path/file.txt

并用符号路径名 cd 它:

cd /this/is/a/link

现在, pwd 命令将返回链接名称:

> pwd
/this/is/a/link

现在,我想获取 file.txt 的绝对路径:

/this/is/a/link/file.txt

但是使用 python 的os.abspath()or os.realpath(),它们都返回真正的路径 ( /this/is/a/real/path/file.txt),这不是我想要的。

我也试过subprocess.Popen('pwd')and sh.pwd(),但也得到了真正的路径而不是符号链接路径。

如何使用 python 获取符号绝对路径?

更新

好的,我阅读了源代码pwd所以我得到了答案。

这很简单:只需获取PWD环境变量。

这是我自己abspath来满足我的要求:

def abspath(p):
    curr_path = os.environ['PWD']
    return os.path.normpath(os.path.join(curr_path, p))
4

3 回答 3

16

os.path.abspath和之间的区别在于os.path.realpathos.path.abspath不能解析符号链接,所以它应该正是您正在寻找的。我愿意:

/home/user$ mkdir test
/home/user$ mkdir test/real
/home/user$ mkdir test/link
/home/user$ touch test/real/file
/home/user$ ln -s /home/user/test/real/file test/link/file
/home/user$ ls -lR test

  test:
  d... link
  d... real

  test/real:
  -... file

  test/link:
  l... file -> /home/user/test/real/file

/home/user$ python

  ... python 3.3.2 ...
  >>> import os
  >>> print(os.path.realpath('test/link/file'))
  /home/user/test/real/file
  >>> print(os.path.abspath('test/link/file'))
  /home/user/test/link/file

所以你去。你是如何使用os.path.abspath你说它解决你的符号链接的?

于 2013-07-23T09:17:58.300 回答
0

您可以这样做来遍历目录:

for root, dirs, files in os.walk("/this/is/a/link"):
    for file in files:
        os.path.join(root, file)

这样,您将获得每个文件的路径,以符号链接名称而不是真实名称为前缀。

于 2013-07-23T09:34:47.983 回答
-1

来自 python 2.7.3 文档:

os.path.abspath(路径)¶

Return a normalized absolutized version of the pathname path. On most platforms, this is equivalent to normpath(join(os.getcwd(), path)).

os.getcwd() 将返回一个真实的路径。例如

/home/user$ mkdir test
/home/user$ cd test
/home/user/test$ mkdir real
/home/user/test$ ln -s real link
/home/user/test$ cd link
/home/user/test/link$ python

  >>> import os
  >>> os.getcwd()
  '/home/user/test/real'
  >>> os.path.abspath("file")
  '/home/user/test/real/file'
  >>> os.path.abspath("../link/file")
  '/home/user/test/link/file'

或者

/home/user/test/link$ cd ..
/home/user/test$ python

  >>> import os
  >>> os.path.abspath("link/file")
  '/home/user/test/link/file'
于 2013-07-23T09:54:50.560 回答