当文件结构包含别名时,Python子进程pwd不一致

时间:2016-08-18 14:43:02

标签: python shell subprocess alias pwd

当我运行以下脚本时

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

结果是

  

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

来自我的Ubuntu终端,命令

pwd

产量

  

/地震/家/名/文档/科研/ Y2 /结果/ S8

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

1 个答案:

答案 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)标准库已经为您提供的内容,例如获取当前工作目录。