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'