0

当我运行以下脚本时

#!/usr/bin/env python
import subprocess
print(subprocess.check_output(["pwd"]))

结果是

/scratch1/name/Dropbox (NAM)/docs/research/Y2/results/s8

在我的 Ubuntu 终端上,命令

pwd

产量

/quake/home/name/docs/research/Y2/results/s8

这是第一条路径的别名。为什么它们不一致?

4

1 回答 1

1

TL;DR - 使用os.getcwd()


您可以使用os.path.realpath将包含符号链接的路径转换为物理路径,解析任何符号链接:

~/src/stackoverflow $ mkdir targetdir
~/src/stackoverflow $ ln -s targetdir symlink
~/src/stackoverflow $ cd symlink
~/src/stackoverflow/symlink $
~/src/stackoverflow/symlink $ python

>>> import os
>>> import subprocess
>>> import shlex
>>>
>>> path = subprocess.check_output('pwd').strip()
>>> path
'/Users/lukasgraf/src/stackoverflow/symlink'
>>> os.path.realpath(path)
'/Users/lukasgraf/src/stackoverflow/targetdir'

该命令还有一个-P选项可以pwd强制执行此操作。

pwd手册页(在 OS X 上):

pwd 实用程序将当前工作目录的绝对路径名写入标准输出。

某些 shell 可能提供与此实用程序类似或相同的内置 pwd 命令。请参阅内置(1)手册页。

 The options are as follows:

 -L      Display the logical current working directory.

 -P      Display the physical current working directory (all symbolic
         links resolved).

 If no options are specified, the -L option is assumed.

所以这也可以:

>>> subprocess.check_output(shlex.split('pwd -P'))
'/Users/lukasgraf/src/stackoverflow/targetdir\n'
>>>

但是,最好的选择是os.getcwd()从 Python 标准库中使用:

>>> os.getcwd()
'/Users/lukasgraf/src/stackoverflow/targetdir'

它没有明确记录,但它似乎已经为您解析了符号链接。在任何情况下,您都希望避免使用(使用subprocess)标准库已经为您提供的东西,例如获取当前工作目录。

于 2016-08-18T15:03:49.000 回答