当我运行以下脚本时
#!/usr/bin/env python
import subprocess
print(subprocess.check_output(["pwd"]))
结果是
/ scratch1 / name / Dropbox(NAM)/ docs / research / Y2 / results / s8
来自我的Ubuntu终端,命令
pwd
产量
/地震/家/名/文档/科研/ Y2 /结果/ S8
是第一个路径的别名。为什么它们不一致?
答案 0 :(得分: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命令 与此实用程序相同。请参阅builtin(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'
>>>
但是,最好的选择是使用Python标准库中的os.getcwd()
:
>>> os.getcwd()
'/Users/lukasgraf/src/stackoverflow/targetdir'
它没有明确记录,但它似乎已经为您解决了符号链接。在任何情况下,您都希望避免出现(使用subprocess
)标准库已经为您提供的内容,例如获取当前工作目录。