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

Python 如何获得符号路径而不是实际路径?,python,symlink,Python,Symlink,假设我有一个名为: /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的绝对路径,如下所示: /th

假设我有一个名为:

/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的
,所以我得到了答案

非常简单:只需获取
PWD
环境变量

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

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

os.path.abspath
os.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
来解析符号链接?

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

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

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

来自python 2.7.3文档:

os.path.abspath(路径)“”

getcwd()将返回实际路径。e、 g

/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'


你为什么需要这个?你到底想做什么?我想使用cscope浏览一个工作项目,它的路径中包含中文字符(我没有修改的权限)。但cscope似乎不支持它。所以我想用一个符号链接和一个脚本来生成cscope.files,然后…,问题来了。这可能是一个更好的问题,可以避免downvotest。这是我关于stackoverflow的第一个问题。我不知道如何改进它,使之成为一个更好的问题这并不重要他们想做什么-这个问题将影响成千上万的人,他们总是试图做其他事情,只需要回答问题…也许他正在做
os.path.abspath(“.”
在更改到符号链接目录后,但一旦你进入了真实目录,就没有办法确定你是如何到达那里的,所以也没有办法检索符号链接的绝对路径(或者说,甚至是基本名称)。还是我错了?据他说(我刚刚证实),如果你进入一个符号链接目录并运行
pwd
(在python之外),它会给你符号链接路径。但他可能不需要进入一个目录,并确定他从那里来。也许定义起点,然后跟踪他在哪里就足够了,在这种情况下,你的建议会起作用。真实路径和链接路径之间的实际区别是什么?是否有一些活动是您无法对链接(或真实)路径执行的,而您可以通过其他链接完成这些活动?我能想到的唯一一件事是你是否能够访问python路径中的资源(如果链接路径在python路径中,但实际路径不是-会发生这种情况吗?)@Dannid在我的例子中,我想CD到工具提供的目录,符号链接指向的实际目录可能会发生更改。如果我遵循符号链接,我总是在正确的(最近的)位置结束。
/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'