如何获得符号路径而不是真实路径?

Posted

技术标签:

【中文标题】如何获得符号路径而不是真实路径?【英文标题】:How to get the symbolic path instead of real path? 【发布时间】:2013-07-23 08:39:38 【问题描述】:

假设我有一个名为:

/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()os.realpath(),它们都返回真实路径(/this/is/a/real/path/file.txt),这不是我想要的。

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

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

更新

好的,我阅读了pwd 的source code,所以我得到了答案。

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

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

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

【问题讨论】:

为什么需要这个?你真正想做什么? 我想用cscope浏览一个工作项目,它的路径中包含中文字符(我无权修改)。但 cscope 似乎不支持它。所以想用符号链接,用脚本生成cscope.files,然后……,问题就来了。 这可能是一个更好的问题,可以避免投票 这是我关于 *** 的第一个问题。我不知道如何改进它成为一个更好的问题 他们想要做什么并不重要——这个问题会影响到成千上万的人,他们总是试图做其他事情,只需要按要求回答问题...... 【参考方案1】:

os.path.abspathos.path.realpath 之间的区别在于os.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,你说它可以解决你的符号链接?

【讨论】:

也许他在切换到符号链接目录后正在做os.path.abspath("."),它确实返回了真正的目录。 但是一旦你进入了真正的目录,无论如何都没有办法确定你是如何到达那里的,所以没有办法检索绝对路径(或者就此而言,甚至符号链接的基本名称)。还是我错了? 据他说(我刚刚确认),如果您进入符号链接目录并运行 pwd(在 python 之外),它会为您提供符号链接路径。但他可能不需要进入目录并确定他从那里的位置。也许定义起点然后跟踪他的位置就足够了,在这种情况下你的建议会奏效。 真实路径和链接路径之间的实际区别是什么?是否有一些您不能对您可以与其他人一起完成的链接(或真实)路径执行的活动?我唯一能想到的是你是否能够访问你的 python 路径中的资源(如果链接路径在 python 路径中但实际路径不是 - 这会发生吗?) @Dannid 在我的情况下,我想 CD 到工具提供的目录,并且符号链接指向的真实目录可能会发生变化。如果我遵循符号链接,我总是会在正确的(最近的)位置结束。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于如何获得符号路径而不是真实路径?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net网站在IIS上获取虚拟路径的问题!

如何获得当前Java文件的路径

如何获得两个地理点坐标之间的最短行驶路径和距离?

让 Find 只打印文件名,而不是完整路径

如何检查提供的路径是符号链接还是常规路径

如何移动相对符号链接?