为什么要同时使用os.path.abspath和os.path.realpath?

hch*_*hch 77 python

在多个开源项目中,我看到人们会os.path.abspath(os.path.realpath(__file__))去获取当前文件的绝对路径.

但是,我发现os.path.abspath(__file__)os.path.realpath(__file__)产生相同的结果.os.path.abspath(os.path.realpath(__file__))似乎有点多余.

人们使用它的原因是什么?

job*_*rad 94

对于你陈述的场景,没有理由组合realpath和abspath,因为在返回结果之前os.path.realpath实际调用os.path.abspath(我将Python 2.5检查到Python 3.6).

  • os.path.abspath 返回绝对路径,但不解析符号链接.
  • os.path.realpath 将首先解析路径中的任何符号链接,然后返回绝对路径.

但是,如果您希望路径包含a ~,则abspath或realpath都不会解析~为用户的主目录,并且生成的路径将无效.您需要使用它os.path.expanduser来解析用户的目录.

为了彻底解释,以下是我在Windows和Linux中验证过的Python 3.4和Python 2.6中的一些结果.当前目录(./)是我的主目录,如下所示:

myhome
|- data (symlink to /mnt/data)
|- subdir (extra directory, for verbose explanation)
Run Code Online (Sandbox Code Playgroud)
# os.path.abspath returns the absolute path, but does NOT resolve symlinks in its argument
os.path.abspath('./')
'/home/myhome'
os.path.abspath('./subdir/../data')
'/home/myhome/data'


# os.path.realpath will resolve symlinks AND return an absolute path from a relative path
os.path.realpath('./')
'/home/myhome'
os.path.realpath('./subdir/../')
'/home/myhome'
os.path.realpath('./subdir/../data')
'/mnt/data'

# NEITHER abspath or realpath will resolve or remove ~.
os.path.abspath('~/data')
'/home/myhome/~/data'

os.path.realpath('~/data')
'/home/myhome/~/data'

# And the returned path will be invalid
os.path.exists(os.path.abspath('~/data'))
False
os.path.exists(os.path.realpath('~/data'))
False

# Use realpath + expanduser to resolve ~
os.path.realpath(os.path.expanduser('~/subdir/../data'))
'/mnt/data'
Run Code Online (Sandbox Code Playgroud)

  • 尼斯.为了说明你的观点,你的最后一个例子应该是`os.path.realpath(os.path.expanduser('〜/ subdir /../ data'))` (3认同)
  • 如果在路径中使用变量,那么也不要忘记os.path.expandvars (2认同)

kdo*_*pen 54

os.path.realpath 在那些支持它们的操作系统上反映出符号链接.

os.path.abspath简单地从路径中移除一些东西.,..从路径树的根目录到命名文件(或符号链接)的完整路径

例如,在Ubuntu上

$ ls -l
total 0
-rw-rw-r-- 1 guest guest 0 Jun 16 08:36 a
lrwxrwxrwx 1 guest guest 1 Jun 16 08:36 b -> a

$ python
Python 2.7.11 (default, Dec 15 2015, 16:46:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> from os.path import abspath, realpath

>>> abspath('b')
'/home/guest/play/paths/b'

>>> realpath('b')
'/home/guest/play/paths/a'
Run Code Online (Sandbox Code Playgroud)

符号链接可以包含相对路径,因此需要使用两者.内部调用realpath可能会返回带有嵌入..部件的路径,abspath然后将其删除.

  • 虽然这个答案描述了两个函数之间的区别,但是`realpath()`的结果可能包含`..`组件并不能真正回答为什么要使用这两个函数的问题; jobrad的答案更准确. (10认同)

Ext*_*com 6

用外行术语来说,如果您尝试获取快捷方式文件的路径,则绝对路径将提供快捷方式位置中存在的文件的完整路径,而realpath则会提供文件的原始位置路径。

绝对路径os.path.abspath()提供了位于当前工作目录或您提到的目录中的文件的完整路径。

实际路径os.path.realpath()给出了所引用文件的完整路径。

例如:

file = "shortcut_folder/filename"
os.path.abspath(file) = "C:/Desktop/shortcut_folder/filename"
os.path.realpath(file) = "D:/PyCharmProjects/Python1stClass/filename"
Run Code Online (Sandbox Code Playgroud)