假设我有一个名为:
的路径/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
的{{3}},所以我得到了答案。
这很简单:只需获取PWD
环境变量。
这是我自己abspath
满足我的要求:
def abspath(p):
curr_path = os.environ['PWD']
return os.path.normpath(os.path.join(curr_path, p))
答案 0 :(得分:15)
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
表示它可以解析您的符号链接?
答案 1 :(得分:0)
您可以执行此操作来遍历目录:
for root, dirs, files in os.walk("/this/is/a/link"):
for file in files:
os.path.join(root, file)
通过这种方式,您将获得每个文件的路径,前缀为符号链接名称而不是真实名称。
答案 2 :(得分:-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()将返回一个真实的路径。 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'
或
/home/user/test/link$ cd ..
/home/user/test$ python
>>> import os
>>> os.path.abspath("link/file")
'/home/user/test/link/file'